// File: /workspace/github_c_makefile_star2_O0/georgeweigt[P]eigenmath/eigenmath.c
// Function: add_rationals
void
add_rationals(struct atom *p1, struct atom *p2)
{
	int sign;
	uint32_t *a, *ab, *b, *ba, *c;

	if (iszero(p1)) {
		push(p2);
		return;
	}

	if (iszero(p2)) {
		push(p1);
		return;
	}

	if (isinteger(p1) && isinteger(p2)) {
		add_integers(p1, p2);
		return;
	}

	ab = mmul(p1->u.q.a, p2->u.q.b);
	ba = mmul(p1->u.q.b, p2->u.q.a);

	if (p1->sign == p2->sign) {
		a = madd(ab, ba);
		sign = p1->sign;
	} else {
		switch (mcmp(ab, ba)) {
		case 1:
			a = msub(ab, ba);
			sign = p1->sign;
			break;
		case 0:
			push_integer(0);
			mfree(ab);
			mfree(ba);
			return;
		case -1:
			a = msub(ba, ab);
			sign = p2->sign;
			break;
		default:
			// never gets here, fix compiler warning
			return;
		}
	}

	mfree(ab);
	mfree(ba);

	b = mmul(p1->u.q.b, p2->u.q.b);
	c = mgcd(a, b);

	push_bignum(sign, mdiv(a, c), mdiv(b, c));

	mfree(a);
	mfree(b);
	mfree(c);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
callq 0xcdc0
cmpl $0x0, %eax
je 0xe40c
movq -0x10(%rbp), %rdi
callq 0x9110
jmp 0xe5d2
movq -0x10(%rbp), %rdi
callq 0xcdc0
cmpl $0x0, %eax
je 0xe428
movq -0x8(%rbp), %rdi
callq 0x9110
jmp 0xe5d2
movq -0x8(%rbp), %rdi
callq 0x9bc0
cmpl $0x0, %eax
je 0xe456
movq -0x10(%rbp), %rdi
callq 0x9bc0
cmpl $0x0, %eax
je 0xe456
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xe620
jmp 0xe5d2
movq -0x8(%rbp), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x7d40
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rsi
callq 0x7d40
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x12(%rax), %eax
movq -0x10(%rbp), %rcx
movzbl 0x12(%rcx), %ecx
cmpl %ecx, %eax
jne 0xe4bb
movq -0x28(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x7ea0
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x12(%rax), %eax
movl %eax, -0x14(%rbp)
jmp 0xe548
movq -0x28(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x8b80
movl %eax, %ecx
movl %ecx, -0x44(%rbp)
subl $-0x1, %eax
je 0xe523
jmp 0xe4d4
movl -0x44(%rbp), %eax
testl %eax, %eax
je 0xe505
jmp 0xe4dd
movl -0x44(%rbp), %eax
subl $0x1, %eax
jne 0xe541
jmp 0xe4e7
movq -0x28(%rbp), %rdi
movq -0x38(%rbp), %rsi
callq 0x8310
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x12(%rax), %eax
movl %eax, -0x14(%rbp)
jmp 0xe546
xorl %edi, %edi
callq 0xca50
movq -0x28(%rbp), %rdi
callq 0x7e70
movq -0x38(%rbp), %rdi
callq 0x7e70
jmp 0xe5d2
movq -0x38(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x8310
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movzbl 0x12(%rax), %eax
movl %eax, -0x14(%rbp)
jmp 0xe546
jmp 0xe5d2
jmp 0xe548
movq -0x28(%rbp), %rdi
callq 0x7e70
movq -0x38(%rbp), %rdi
callq 0x7e70
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x7d40
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x8cd0
movq %rax, -0x40(%rbp)
movl -0x14(%rbp), %eax
movl %eax, -0x54(%rbp)
movq -0x20(%rbp), %rdi
movq -0x40(%rbp), %rsi
callq 0x8470
movq %rax, -0x50(%rbp)
movq -0x30(%rbp), %rdi
movq -0x40(%rbp), %rsi
callq 0x8470
movl -0x54(%rbp), %edi
movq -0x50(%rbp), %rsi
movq %rax, %rdx
callq 0xe740
movq -0x20(%rbp), %rdi
callq 0x7e70
movq -0x30(%rbp), %rdi
callq 0x7e70
movq -0x40(%rbp), %rdi
callq 0x7e70
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax,%rax)