// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/eval.c
// Function: binary
static void
binary(struct expr *expr, enum tokenkind op, struct expr *l, struct expr *r)
{
	expr->kind = EXPRCONST;
	if (l->type->prop & PROPFLOAT)
		op |= F;
	else if (l->type->prop & PROPINT && l->type->u.basic.issigned)
		op |= S;
	switch (op) {
	case TMUL:
	case TMUL|S:     expr->u.constant.u = l->u.constant.u * r->u.constant.u; break;
	case TMUL|F:     expr->u.constant.f = l->u.constant.f * r->u.constant.f; break;
	case TDIV:       expr->u.constant.u = l->u.constant.u / r->u.constant.u; break;
	case TDIV|S:     expr->u.constant.i = l->u.constant.i / r->u.constant.i; break;
	case TDIV|F:     expr->u.constant.f = l->u.constant.f / r->u.constant.f; break;
	case TMOD:       expr->u.constant.u = l->u.constant.u % r->u.constant.u; break;
	case TMOD|S:     expr->u.constant.i = l->u.constant.i % r->u.constant.i; break;
	case TADD:
	case TADD|S:     expr->u.constant.u = l->u.constant.u + r->u.constant.u; break;
	case TADD|F:     expr->u.constant.f = l->u.constant.f + r->u.constant.f; break;
	case TSUB:
	case TSUB|S:     expr->u.constant.u = l->u.constant.u - r->u.constant.u; break;
	case TSUB|F:     expr->u.constant.f = l->u.constant.f - r->u.constant.f; break;
	case TSHL:
	case TSHL|S:     expr->u.constant.u = l->u.constant.u << (r->u.constant.u & 63); break;
	case TSHR:       expr->u.constant.u = l->u.constant.u >> (r->u.constant.u & 63); break;
	case TSHR|S:     expr->u.constant.i = l->u.constant.i >> (r->u.constant.u & 63); break;
	case TBAND:
	case TBAND|S:    expr->u.constant.u = l->u.constant.u & r->u.constant.u; break;
	case TBOR:
	case TBOR|S:     expr->u.constant.u = l->u.constant.u | r->u.constant.u; break;
	case TXOR:
	case TXOR|S:     expr->u.constant.u = l->u.constant.u ^ r->u.constant.u; break;
	case TLESS:      expr->u.constant.u = l->u.constant.u < r->u.constant.u; break;
	case TLESS|S:    expr->u.constant.u = l->u.constant.i < r->u.constant.i; break;
	case TLESS|F:    expr->u.constant.u = l->u.constant.f < r->u.constant.f; break;
	case TGREATER:   expr->u.constant.u = l->u.constant.u > r->u.constant.u; break;
	case TGREATER|S: expr->u.constant.u = l->u.constant.i > r->u.constant.i; break;
	case TGREATER|F: expr->u.constant.u = l->u.constant.f > r->u.constant.f; break;
	case TLEQ:       expr->u.constant.u = l->u.constant.u <= r->u.constant.u; break;
	case TLEQ|S:     expr->u.constant.u = l->u.constant.i <= r->u.constant.i; break;
	case TLEQ|F:     expr->u.constant.u = l->u.constant.f <= r->u.constant.f; break;
	case TGEQ:       expr->u.constant.u = l->u.constant.u >= r->u.constant.u; break;
	case TGEQ|S:     expr->u.constant.u = l->u.constant.i >= r->u.constant.i; break;
	case TGEQ|F:     expr->u.constant.u = l->u.constant.f >= r->u.constant.f; break;
	case TEQL:
	case TEQL|S:     expr->u.constant.u = l->u.constant.u == r->u.constant.u; break;
	case TEQL|F:     expr->u.constant.u = l->u.constant.f == r->u.constant.f; break;
	case TNEQ:
	case TNEQ|S:     expr->u.constant.u = l->u.constant.u != r->u.constant.u; break;
	case TNEQ|F:     expr->u.constant.u = l->u.constant.f != r->u.constant.f; break;
	default:
		fatal("internal error; unknown binary expression");
	}
	cast(expr);
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
movl $0x1, (%rdi)
movq 0x8(%rdx), %rax
movl 0x4(%rax), %edi
testb $0x20, %dil
jne 0x6156
testb $0x2, %dil
je 0x615c
movl %esi, %edi
orl $0x200, %edi            # imm = 0x200
cmpb $0x0, 0x40(%rax)
cmovel %esi, %edi
movl %edi, %esi
jmp 0x615c
orl $0x100, %esi            # imm = 0x100
leal -0x4a(%rsi), %eax
cmpl $0x11, %eax
jbe 0x618e
leal -0x24a(%rsi), %eax
cmpl $0x11, %eax
ja 0x61ab
leaq 0xbf6e(%rip), %rsi      # 0x120e4
movslq (%rsi,%rax,4), %rax
addq %rsi, %rax
jmpq *%rax
movq 0x30(%rdx), %rax
cqto
idivq 0x30(%rcx)
jmp 0x63b5
leaq 0xbecb(%rip), %rsi      # 0x12060
movslq (%rsi,%rax,4), %rax
addq %rsi, %rax
jmpq *%rax
movq 0x30(%rcx), %rax
andq 0x30(%rdx), %rax
jmp 0x63b5
addl $0xfffffeb5, %esi       # imm = 0xFFFFFEB5
cmpl $0xe, %esi
ja 0x631b
leaq 0xbee7(%rip), %rax      # 0x120a8
movslq (%rax,%rsi,4), %rsi
addq %rax, %rsi
jmpq *%rsi
movsd 0x30(%rdx), %xmm0
mulsd 0x30(%rcx), %xmm0
jmp 0x6379
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
setne %dl
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
sete %dl
jmp 0x6303
movq 0x30(%rcx), %rax
addq 0x30(%rdx), %rax
jmp 0x63b5
movq 0x30(%rdx), %rax
movb 0x30(%rcx), %cl
shlq %cl, %rax
jmp 0x63b5
movq 0x30(%rcx), %rax
imulq 0x30(%rdx), %rax
jmp 0x63b5
movq 0x30(%rdx), %rax
subq 0x30(%rcx), %rax
jmp 0x63b5
movq 0x30(%rcx), %rax
xorq 0x30(%rdx), %rax
jmp 0x63b5
movq 0x30(%rcx), %rax
orq 0x30(%rdx), %rax
jmp 0x63b5
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
seta %dl
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
setb %dl
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
divq 0x30(%rcx)
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
divq 0x30(%rcx)
jmp 0x63b5
movq 0x30(%rdx), %rax
movb 0x30(%rcx), %cl
shrq %cl, %rax
jmp 0x63b5
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
setbe %dl
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
setae %dl
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
setle %dl
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
setg %dl
jmp 0x6303
movq 0x30(%rdx), %rax
cqto
idivq 0x30(%rcx)
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
setge %dl
jmp 0x6303
movq 0x30(%rdx), %rax
xorl %edx, %edx
cmpq 0x30(%rcx), %rax
setl %dl
movq %rdx, 0x30(%rbx)
jmp 0x63b9
movq 0x30(%rdx), %rax
movb 0x30(%rcx), %cl
sarq %cl, %rax
jmp 0x63b5
leaq 0xbedb(%rip), %rdi      # 0x121fd
xorl %eax, %eax
callq 0xcffb
jmp 0x63b9
movsd 0x30(%rdx), %xmm0
xorl %eax, %eax
ucomisd 0x30(%rcx), %xmm0
jmp 0x639d
movsd 0x30(%rdx), %xmm0
xorl %eax, %eax
ucomisd 0x30(%rcx), %xmm0
jmp 0x638c
movsd 0x30(%rcx), %xmm0
cmpneqsd 0x30(%rdx), %xmm0
jmp 0x63ad
movsd 0x30(%rdx), %xmm0
addsd 0x30(%rcx), %xmm0
jmp 0x6379
movsd 0x30(%rdx), %xmm0
divsd 0x30(%rcx), %xmm0
jmp 0x6379
movsd 0x30(%rdx), %xmm0
subsd 0x30(%rcx), %xmm0
movsd %xmm0, 0x30(%rbx)
jmp 0x63b9
movsd 0x30(%rcx), %xmm0
xorl %eax, %eax
ucomisd 0x30(%rdx), %xmm0
seta %al
jmp 0x63b5
movsd 0x30(%rcx), %xmm0
xorl %eax, %eax
ucomisd 0x30(%rdx), %xmm0
setae %al
jmp 0x63b5
movsd 0x30(%rcx), %xmm0
cmpeqsd 0x30(%rdx), %xmm0
movq %xmm0, %rax
andl $0x1, %eax
movq %rax, 0x30(%rbx)
movq %rbx, %rdi
popq %rbx
jmp 0x60cd
nop