// File: /workspace/github_c_makefile_star2_O0/georgeweigt[P]eigenmath/eigenmath.c
// Function: eval_rotate
void
eval_rotate(struct atom *p1)
{
	int m, n;
	uint32_t c;
	struct atom *PSI, *OPCODE, *PHASE;

	push(cadr(p1));
	evalf();
	PSI = pop();

	if (!istensor(PSI) || PSI->u.tensor->ndim > 1 || PSI->u.tensor->nelem > 32768 || !POWEROF2(PSI->u.tensor->nelem))
		stopf("rotate error 1 first argument is not a vector or dimension error");

	c = 0;

	p1 = cddr(p1);

	while (iscons(p1)) {

		if (!iscons(cdr(p1)))
			stopf("rotate error 2 unexpected end of argument list");

		OPCODE = car(p1);
		push(cadr(p1));
		evalf();
		n = pop_integer();

		if (n > 14 || (1 << n) >= PSI->u.tensor->nelem)
			stopf("rotate error 3 qubit number format or range");

		p1 = cddr(p1);

		if (OPCODE == symbol(C_UPPER)) {
			c |= 1 << n;
			continue;
		}

		if (OPCODE == symbol(H_UPPER)) {
			rotate_h(PSI, c, n);
			c = 0;
			continue;
		}

		if (OPCODE == symbol(P_UPPER)) {
			if (!iscons(p1))
				stopf("rotate error 2 unexpected end of argument list");
			push(car(p1));
			p1 = cdr(p1);
			evalf();
			push(imaginaryunit);
			multiply();
			expfunc();
			PHASE = pop();
			rotate_p(PSI, PHASE, c, n);
			c = 0;
			continue;
		}

		if (OPCODE == symbol(Q_UPPER)) {
			rotate_q(PSI, n);
			c = 0;
			continue;
		}

		if (OPCODE == symbol(V_UPPER)) {
			rotate_v(PSI, n);
			c = 0;
			continue;
		}

		if (OPCODE == symbol(W_UPPER)) {
			m = n;
			if (!iscons(p1))
				stopf("rotate error 2 unexpected end of argument list");
			push(car(p1));
			p1 = cdr(p1);
			evalf();
			n = pop_integer();
			if (n > 14 || (1 << n) >= PSI->u.tensor->nelem)
				stopf("rotate error 3 qubit number format or range");
			rotate_w(PSI, c, m, n);
			c = 0;
			continue;
		}

		if (OPCODE == symbol(X_UPPER)) {
			rotate_x(PSI, c, n);
			c = 0;
			continue;
		}

		if (OPCODE == symbol(Y_UPPER)) {
			rotate_y(PSI, c, n);
			c = 0;
			continue;
		}

		if (OPCODE == symbol(Z_UPPER)) {
			rotate_z(PSI, c, n);
			c = 0;
			continue;
		}

		stopf("rotate error 4 unknown rotation code");
	}

	push(PSI);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f7ea
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x2f7f5
movq 0x2f20f(%rip), %rax     # 0x5ea00
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f835
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f81d
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
jmp 0x2f828
movq 0x2f1dc(%rip), %rax     # 0x5ea00
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
jmp 0x2f840
movq 0x2f1c4(%rip), %rax     # 0x5ea00
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rdi
callq 0x9110
callq 0xa660
callq 0x91d0
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x7, %eax
jne 0x2f89e
movq -0x20(%rbp), %rax
movq (%rax), %rax
cmpl $0x1, (%rax)
jg 0x2f89e
movq -0x20(%rbp), %rax
movq (%rax), %rax
cmpl $0x8000, 0x64(%rax)     # imm = 0x8000
jg 0x2f89e
movq -0x20(%rbp), %rax
movq (%rax), %rax
movl 0x64(%rax), %eax
movq -0x20(%rbp), %rcx
movq (%rcx), %rcx
movl 0x64(%rcx), %ecx
subl $0x1, %ecx
andl %ecx, %eax
cmpl $0x0, %eax
je 0x2f8aa
leaq 0x1a06f(%rip), %rdi     # 0x49914
callq 0x78d0
movl $0x0, -0x14(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f8cc
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x50(%rbp)
jmp 0x2f8d7
movq 0x2f12d(%rip), %rax     # 0x5ea00
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f918
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f8ff
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x58(%rbp)
jmp 0x2f90a
movq 0x2f0fa(%rip), %rax     # 0x5ea00
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x60(%rbp)
jmp 0x2f923
movq 0x2f0e1(%rip), %rax     # 0x5ea00
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2fdde
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f957
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0x2f962
movq 0x2f0a2(%rip), %rax     # 0x5ea00
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
je 0x2f97b
leaq 0x19fdf(%rip), %rdi     # 0x49955
callq 0x78d0
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f995
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x70(%rbp)
jmp 0x2f9a0
movq 0x2f064(%rip), %rax     # 0x5ea00
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f9c3
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x78(%rbp)
jmp 0x2f9ce
movq 0x2f036(%rip), %rax     # 0x5ea00
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2fa11
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2f9f6
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x80(%rbp)
jmp 0x2fa01
movq 0x2f003(%rip), %rax     # 0x5ea00
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x88(%rbp)
jmp 0x2fa1f
movq 0x2efe8(%rip), %rax     # 0x5ea00
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rdi
callq 0x9110
callq 0xa660
callq 0x13520
movl %eax, -0x10(%rbp)
cmpl $0xe, -0x10(%rbp)
jg 0x2fa54
movl -0x10(%rbp), %ecx
movl $0x1, %eax
shll %cl, %eax
movq -0x20(%rbp), %rcx
movq (%rcx), %rcx
cmpl 0x64(%rcx), %eax
jl 0x2fa60
leaq 0x19f29(%rip), %rdi     # 0x49984
callq 0x78d0
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2fa7e
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x90(%rbp)
jmp 0x2fa8c
movq 0x2ef7b(%rip), %rax     # 0x5ea00
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2fadc
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2faba
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x98(%rbp)
jmp 0x2fac8
movq 0x2ef3f(%rip), %rax     # 0x5ea00
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0xa0(%rbp)
jmp 0x2faea
movq 0x2ef1d(%rip), %rax     # 0x5ea00
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x28(%rbp), %rax
cmpq 0x2cca0(%rip), %rax     # 0x5c7a0
jne 0x2fb17
movl -0x10(%rbp), %ecx
movl $0x1, %eax
shll %cl, %eax
orl -0x14(%rbp), %eax
movl %eax, -0x14(%rbp)
jmp 0x2f92b
movq -0x28(%rbp), %rax
cmpq 0x2dc1e(%rip), %rax     # 0x5d740
jne 0x2fb3f
movq -0x20(%rbp), %rdi
movl -0x14(%rbp), %esi
movl -0x10(%rbp), %edx
callq 0x2fdf0
movl $0x0, -0x14(%rbp)
jmp 0x2f92b
movq -0x28(%rbp), %rax
cmpq 0x2f4f6(%rip), %rax     # 0x5f040
jne 0x2fc1a
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
je 0x2fb69
leaq 0x19df1(%rip), %rdi     # 0x49955
callq 0x78d0
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2fb86
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xa8(%rbp)
jmp 0x2fb94
movq 0x2ee73(%rip), %rax     # 0x5ea00
movq %rax, -0xa8(%rbp)
movq -0xa8(%rbp), %rdi
callq 0x9110
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2fbbe
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0xb0(%rbp)
jmp 0x2fbcc
movq 0x2ee3b(%rip), %rax     # 0x5ea00
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0x8(%rbp)
callq 0xa660
movq 0xf4efd(%rip), %rdi     # 0x124ae0
callq 0x9110
callq 0xc280
callq 0x14a50
callq 0x91d0
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rdi
movq -0x30(%rbp), %rsi
movl -0x14(%rbp), %edx
movl -0x10(%rbp), %ecx
callq 0x2ff30
movl $0x0, -0x14(%rbp)
jmp 0x2f92b
movq -0x28(%rbp), %rax
cmpq 0x2f73b(%rip), %rax     # 0x5f360
jne 0x2fc3f
movq -0x20(%rbp), %rdi
movl -0x10(%rbp), %esi
callq 0x2ffd0
movl $0x0, -0x14(%rbp)
jmp 0x2f92b
movq -0x28(%rbp), %rax
cmpq 0x306b6(%rip), %rax     # 0x60300
jne 0x2fc64
movq -0x20(%rbp), %rdi
movl -0x10(%rbp), %esi
callq 0x300f0
movl $0x0, -0x14(%rbp)
jmp 0x2f92b
movq -0x28(%rbp), %rax
cmpq 0x309b1(%rip), %rax     # 0x60620
jne 0x2fd55
movl -0x10(%rbp), %eax
movl %eax, -0xc(%rbp)
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
je 0x2fc94
leaq 0x19cc6(%rip), %rdi     # 0x49955
callq 0x78d0
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2fcb1
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xb8(%rbp)
jmp 0x2fcbf
movq 0x2ed48(%rip), %rax     # 0x5ea00
movq %rax, -0xb8(%rbp)
movq -0xb8(%rbp), %rdi
callq 0x9110
movq -0x8(%rbp), %rax
movzbl 0x10(%rax), %eax
cmpl $0x1, %eax
jne 0x2fce9
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0xc0(%rbp)
jmp 0x2fcf7
movq 0x2ed10(%rip), %rax     # 0x5ea00
movq %rax, -0xc0(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0x8(%rbp)
callq 0xa660
callq 0x13520
movl %eax, -0x10(%rbp)
cmpl $0xe, -0x10(%rbp)
jg 0x2fd2b
movl -0x10(%rbp), %ecx
movl $0x1, %eax
shll %cl, %eax
movq -0x20(%rbp), %rcx
movq (%rcx), %rcx
cmpl 0x64(%rcx), %eax
jl 0x2fd37
leaq 0x19c52(%rip), %rdi     # 0x49984
callq 0x78d0
movq -0x20(%rbp), %rdi
movl -0x14(%rbp), %esi
movl -0xc(%rbp), %edx
movl -0x10(%rbp), %ecx
callq 0x30210
movl $0x0, -0x14(%rbp)
jmp 0x2f92b
movq -0x28(%rbp), %rax
cmpq 0x30be0(%rip), %rax     # 0x60940
jne 0x2fd7d
movq -0x20(%rbp), %rdi
movl -0x14(%rbp), %esi
movl -0x10(%rbp), %edx
callq 0x30300
movl $0x0, -0x14(%rbp)
jmp 0x2f92b
movq -0x28(%rbp), %rax
cmpq 0x30ed8(%rip), %rax     # 0x60c60
jne 0x2fda5
movq -0x20(%rbp), %rdi
movl -0x14(%rbp), %esi
movl -0x10(%rbp), %edx
callq 0x303d0
movl $0x0, -0x14(%rbp)
jmp 0x2f92b
movq -0x28(%rbp), %rax
cmpq 0x311d0(%rip), %rax     # 0x60f80
jne 0x2fdcd
movq -0x20(%rbp), %rdi
movl -0x14(%rbp), %esi
movl -0x10(%rbp), %edx
callq 0x304d0
movl $0x0, -0x14(%rbp)
jmp 0x2f92b
leaq 0x19bdc(%rip), %rdi     # 0x499b0
callq 0x78d0
jmp 0x2f92b
movq -0x20(%rbp), %rdi
callq 0x9110
addq $0xc0, %rsp
popq %rbp
retq