// File: /workspace/github_c_makefile_star2_O0/michaelforney[P]cproc/expr.c
// Function: condexpr
struct expr *
condexpr(struct scope *s)
{
	struct expr *e, *l, *r;
	struct type *t, *lt, *rt;
	enum typequal tq;

	e = binaryexpr(s, NULL, 0);
	if (!consume(TQUESTION))
		return e;
	l = expr(s);
	expect(TCOLON, "in conditional expression");
	r = condexpr(s);

	lt = l->type;
	rt = r->type;
	if (lt == rt) {
		t = lt;
	} else if (lt->prop & PROPARITH && rt->prop & PROPARITH) {
		t = commonreal(&l, &r);
	} else if (lt == &typevoid && rt == &typevoid) {
		t = &typevoid;
	} else {
		l = eval(l);
		r = eval(r);
		if (nullpointer(l) && rt->kind == TYPEPOINTER) {
			t = rt;
		} else if (nullpointer(r) && lt->kind == TYPEPOINTER) {
			t = lt;
		} else if (lt->kind == TYPEPOINTER && rt->kind == TYPEPOINTER) {
			tq = lt->qual | rt->qual;
			lt = lt->base;
			rt = rt->base;
			if (lt == &typevoid || rt == &typevoid) {
				t = &typevoid;
			} else if (typecompatible(lt, rt)) {
				t = typecomposite(lt, rt);
			} else {
				error(&tok.loc, "operands of conditional operator must have compatible types");
				return NULL;  /* unreachable */
			}
			t = mkpointertype(t, tq);
		} else {
			error(&tok.loc, "invalid operands to conditional operator");
			return NULL;  /* unreachable */
		}
	}
	e = eval(e);
	if (e->kind == EXPRCONST && e->type->prop & PROPINT)
		return exprconvert(e->u.constant.u ? l : r, t);
	e = mkexpr(EXPRCOND, t, e);
	e->u.cond.t = l;
	e->u.cond.f = r;
	return e;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
xorl %edx, %edx
callq 0x8e30
movq %rax, -0x18(%rbp)
movl $0x5e, %edi
callq 0xd910
testb $0x1, %al
jne 0x8b7a
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x8e1f
movq -0x10(%rbp), %rdi
callq 0x8f10
movq %rax, -0x20(%rbp)
movl $0x5f, %edi
leaq 0x10ec7(%rip), %rsi     # 0x19a5a
callq 0xd8d0
movq -0x10(%rbp), %rdi
callq 0x8b40
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x40(%rbp), %rax
jne 0x8bd4
movq -0x38(%rbp), %rax
movq %rax, -0x30(%rbp)
jmp 0x8d90
movq -0x38(%rbp), %rax
movl 0x4(%rax), %eax
andl $0x8, %eax
cmpl $0x0, %eax
je 0x8c08
movq -0x40(%rbp), %rax
movl 0x4(%rax), %eax
andl $0x8, %eax
cmpl $0x0, %eax
je 0x8c08
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x8fa0
movq %rax, -0x30(%rbp)
jmp 0x8d8e
leaq 0x18e29(%rip), %rax     # 0x21a38
cmpq %rax, -0x38(%rbp)
jne 0x8c32
leaq 0x18e1c(%rip), %rax     # 0x21a38
cmpq %rax, -0x40(%rbp)
jne 0x8c32
leaq 0x18e0f(%rip), %rax     # 0x21a38
movq %rax, -0x30(%rbp)
jmp 0x8d8c
movq -0x20(%rbp), %rdi
callq 0x7010
movq %rax, -0x20(%rbp)
movq -0x28(%rbp), %rdi
callq 0x7010
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rdi
callq 0x8210
testb $0x1, %al
jne 0x8c5b
jmp 0x8c71
movq -0x40(%rbp), %rax
cmpl $0xc, (%rax)
jne 0x8c71
movq -0x40(%rbp), %rax
movq %rax, -0x30(%rbp)
jmp 0x8d8a
movq -0x28(%rbp), %rdi
callq 0x8210
testb $0x1, %al
jne 0x8c80
jmp 0x8c96
movq -0x38(%rbp), %rax
cmpl $0xc, (%rax)
jne 0x8c96
movq -0x38(%rbp), %rax
movq %rax, -0x30(%rbp)
jmp 0x8d88
movq -0x38(%rbp), %rax
cmpl $0xc, (%rax)
jne 0x8d60
movq -0x40(%rbp), %rax
cmpl $0xc, (%rax)
jne 0x8d60
movq -0x38(%rbp), %rax
movl 0x38(%rax), %eax
movq -0x40(%rbp), %rcx
orl 0x38(%rcx), %eax
movl %eax, -0x44(%rbp)
movq -0x38(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x40(%rbp)
leaq 0x18d58(%rip), %rax     # 0x21a38
cmpq %rax, -0x38(%rbp)
je 0x8cf3
leaq 0x18d4b(%rip), %rax     # 0x21a38
cmpq %rax, -0x40(%rbp)
jne 0x8d00
leaq 0x18d3e(%rip), %rax     # 0x21a38
movq %rax, -0x30(%rbp)
jmp 0x8d4e
movq -0x38(%rbp), %rdi
movq -0x40(%rbp), %rsi
callq 0x11890
testb $0x1, %al
jne 0x8d13
jmp 0x8d26
movq -0x38(%rbp), %rdi
movq -0x40(%rbp), %rsi
callq 0x11ae0
movq %rax, -0x30(%rbp)
jmp 0x8d4c
leaq 0x1947b(%rip), %rdi     # 0x221a8
addq $0x8, %rdi
leaq 0x10d3c(%rip), %rsi     # 0x19a74
movb $0x0, %al
callq 0x11190
movq $0x0, -0x8(%rbp)
jmp 0x8e1f
jmp 0x8d4e
movq -0x30(%rbp), %rdi
movl -0x44(%rbp), %esi
callq 0x11760
movq %rax, -0x30(%rbp)
jmp 0x8d86
leaq 0x19441(%rip), %rdi     # 0x221a8
addq $0x8, %rdi
leaq 0x10d3e(%rip), %rsi     # 0x19ab0
movb $0x0, %al
callq 0x11190
movq $0x0, -0x8(%rbp)
jmp 0x8e1f
jmp 0x8d88
jmp 0x8d8a
jmp 0x8d8c
jmp 0x8d8e
jmp 0x8d90
movq -0x18(%rbp), %rdi
callq 0x7010
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x8de9
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movl 0x4(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
je 0x8de9
movq -0x18(%rbp), %rax
cmpq $0x0, 0x30(%rax)
je 0x8dce
movq -0x20(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x8dd6
movq -0x28(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x8290
movq %rax, -0x8(%rbp)
jmp 0x8e1f
movq -0x30(%rbp), %rsi
movq -0x18(%rbp), %rdx
movl $0xa, %edi
callq 0x9040
movq %rax, -0x18(%rbp)
movq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x28(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax)