// File: /workspace/github_c_makefile_star2_O0/georgeweigt[P]eigenmath/eigenmath.c
// Function: factor_factor
void
factor_factor(void)
{
	uint32_t *numer, *denom;
	struct atom *INPUT, *BASE, *EXPO;

	INPUT = pop();

	if (car(INPUT) == symbol(POWER)) {

		BASE = cadr(INPUT);
		EXPO = caddr(INPUT);

		if (!isrational(BASE) || !isrational(EXPO)) {
			push(INPUT); // cannot factor
			return;
		}

		if (isminusone(BASE)) {
			push(INPUT); // -1 to the M
			return;
		}

		if (isnegativenumber(BASE)) {
			push_symbol(POWER);
			push_integer(-1);
			push(EXPO);
			list(3); // leave on stack
		}

		numer = BASE->u.q.a;
		denom = BASE->u.q.b;

		if (!MEQUAL(numer, 1))
			factor_bignum(numer, EXPO);

		if (!MEQUAL(denom, 1)) {
			// flip sign of exponent
			push(EXPO);
			negate();
			EXPO = pop();
			factor_bignum(denom, EXPO);
		}

		return;
	}

	if (!isrational(INPUT) || iszero(INPUT) || isplusone(INPUT) || isminusone(INPUT)) {
		push(INPUT);
		return;
	}

	if (isnegativenumber(INPUT))
		push_integer(-1);

	numer = INPUT->u.q.a;
	denom = INPUT->u.q.b;

	if (!MEQUAL(numer, 1))
		factor_bignum(numer, one);

	if (!MEQUAL(denom, 1))
		factor_bignum(denom, minusone);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
callq 0x91d0
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2481e
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x24829
movq 0x3a1db(%rip), %rax     # 0x5ea00
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpq 0x3ca7c(%rip), %rax     # 0x612b0
jne 0x24ab2
movq -0x18(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x24855
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x24860
movq 0x3a1a4(%rip), %rax     # 0x5ea00
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x248a0
movq -0x18(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x24888
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
jmp 0x24893
movq 0x3a171(%rip), %rax     # 0x5ea00
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
jmp 0x248ab
movq 0x3a159(%rip), %rax     # 0x5ea00
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x248ce
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x50(%rbp)
jmp 0x248d9
movq 0x3a12b(%rip), %rax     # 0x5ea00
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2491a
movq -0x18(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x24901
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x58(%rbp)
jmp 0x2490c
movq 0x3a0f8(%rip), %rax     # 0x5ea00
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x60(%rbp)
jmp 0x24925
movq 0x3a0df(%rip), %rax     # 0x5ea00
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x249b1
movq -0x18(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2494d
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0x24958
movq 0x3a0ac(%rip), %rax     # 0x5ea00
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x24999
movq -0x18(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x24980
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x70(%rbp)
jmp 0x2498b
movq 0x3a079(%rip), %rax     # 0x5ea00
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x78(%rbp)
jmp 0x249a4
movq 0x3a060(%rip), %rax     # 0x5ea00
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x80(%rbp)
jmp 0x249bc
movq 0x3a048(%rip), %rax     # 0x5ea00
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x4, %eax
jne 0x249de
movq -0x28(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x4, %eax
je 0x249ec
movq -0x18(%rbp), %rdi
callq 0x9110
jmp 0x24b69
movq -0x20(%rbp), %rdi
callq 0x10770
cmpl $0x0, %eax
je 0x24a08
movq -0x18(%rbp), %rdi
callq 0x9110
jmp 0x24b69
movq -0x20(%rbp), %rdi
callq 0x9e30
cmpl $0x0, %eax
je 0x24a3f
movq 0x3c893(%rip), %rdi     # 0x612b0
callq 0x9110
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0xca50
movq -0x28(%rbp), %rdi
callq 0x9110
movl $0x3, %edi
callq 0x90d0
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x8(%rbp)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rax
cmpl $0x1, -0x4(%rax)
jne 0x24a69
movq -0x8(%rbp), %rax
cmpl $0x1, (%rax)
je 0x24a76
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x364d0
movq -0x10(%rbp), %rax
cmpl $0x1, -0x4(%rax)
jne 0x24a89
movq -0x10(%rbp), %rax
cmpl $0x1, (%rax)
je 0x24aad
movq -0x28(%rbp), %rdi
callq 0x9110
callq 0xb4b0
callq 0x91d0
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x364d0
jmp 0x24b69
movq -0x18(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x4, %eax
jne 0x24ae9
movq -0x18(%rbp), %rdi
callq 0xcdc0
cmpl $0x0, %eax
jne 0x24ae9
movq -0x18(%rbp), %rdi
callq 0xd4c0
cmpl $0x0, %eax
jne 0x24ae9
movq -0x18(%rbp), %rdi
callq 0x10770
cmpl $0x0, %eax
je 0x24af4
movq -0x18(%rbp), %rdi
callq 0x9110
jmp 0x24b69
movq -0x18(%rbp), %rdi
callq 0x9e30
cmpl $0x0, %eax
je 0x24b0c
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0xca50
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x8(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rax
cmpl $0x1, -0x4(%rax)
jne 0x24b36
movq -0x8(%rbp), %rax
cmpl $0x1, (%rax)
je 0x24b46
movq -0x8(%rbp), %rdi
movq 0xfff97(%rip), %rsi     # 0x124ad8
callq 0x364d0
movq -0x10(%rbp), %rax
cmpl $0x1, -0x4(%rax)
jne 0x24b59
movq -0x10(%rbp), %rax
cmpl $0x1, (%rax)
je 0x24b69
movq -0x10(%rbp), %rdi
movq 0x10a88c(%rip), %rsi    # 0x12f3f0
callq 0x364d0
addq $0x80, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)