// File: /workspace/github_c_makefile_star2_O0/Encryptr[P]O-plus-plus/opp/analysis/analysis.c
// Function: opp_analize_time_eval
static struct Opp_Node* opp_analize_time_eval(struct Opp_Analize* ctx, struct Opp_Node* expr)
{
	#define CLEAR_NODE(node, lhs) { \
		temp.line = node->debug.line;\
		temp.colum = node->debug.colum; \
		memset(node, 0, sizeof(struct Opp_Node)); \
		node->type = EUNARY; \
		node->debug = temp; \
		if (lhs->unary_expr.type == TSTR || lhs->unary_expr.type == TINTEGER) \
			node->unary_expr.type = TINTEGER; \
		else \
			node->unary_expr.type = TFLOAT; \
	}

	#define NUM_OP(op) { \
		if (lhs->unary_expr.type == TINTEGER || lhs->unary_expr.type == TSTR) { \
			if (rhs->unary_expr.type == TFLOAT) \
				expr->unary_expr.val.i64val = lhs->unary_expr.val.i64val op (int64_t)rhs->unary_expr.val.f64val; \
			else \
				expr->unary_expr.val.i64val = lhs->unary_expr.val.i64val op rhs->unary_expr.val.i64val; \
		} \
		else { \
			if (rhs->unary_expr.type == TINTEGER) \
				expr->unary_expr.val.f64val = lhs->unary_expr.val.f64val op (double)rhs->unary_expr.val.i64val; \
			else \
				expr->unary_expr.val.f64val = lhs->unary_expr.val.f64val op rhs->unary_expr.val.f64val; \
		} \
	}

	#define CMP_OP(op) { \
		if (lhs->unary_expr.type == TINTEGER || lhs->unary_expr.type == TSTR) { \
			if (rhs->unary_expr.type == TFLOAT) \
				expr->unary_expr.val.i64val = lhs->unary_expr.val.i64val op (int64_t)rhs->unary_expr.val.f64val; \
			else \
				expr->unary_expr.val.i64val = lhs->unary_expr.val.i64val op rhs->unary_expr.val.i64val; \
		} \
		else { \
			if (rhs->unary_expr.type == TINTEGER) \
				expr->unary_expr.val.i64val = lhs->unary_expr.val.f64val op (double)rhs->unary_expr.val.i64val; \
			else \
				expr->unary_expr.val.i64val = lhs->unary_expr.val.f64val op rhs->unary_expr.val.f64val; \
		} \
	}

	struct Opp_Node* lhs = NULL;
	struct Opp_Node* rhs = NULL;
	struct Opp_Debug temp;

	switch (expr->type)
	{
		case EUNARY: {
			if (expr->unary_expr.type == TIDENT)
				return NULL;
			return expr;
		}

		case EBIN: {
			// TODO: add x * 0 and x* 1 optimizations
			lhs = opp_analize_time_eval(ctx, expr->bin_expr.left);
			rhs = opp_analize_time_eval(ctx, expr->bin_expr.right);
			
			if (lhs == NULL || rhs == NULL) return NULL;

			const int op = expr->bin_expr.tok;
			CLEAR_NODE(expr, lhs);


			switch (op)
			{
				case TADD: NUM_OP(+=); break;
				case TMIN: NUM_OP(-=); break;
				case TMUL: NUM_OP(*=); break;
				case TDIV: NUM_OP(/=); break;
				case TMOD: 
					if (lhs->unary_expr.type != TINTEGER && lhs->unary_expr.type != TSTR)
						opp_semantics_error(ctx, expr, "Mod operation can only be preformed on integers");
					lhs->unary_expr.val.i64val %= rhs->unary_expr.val.i64val;
					break;

				default: break;
			}

			return expr;
		}

		case ELOGIC: {
			lhs = opp_analize_time_eval(ctx, expr->logic_expr.left);
			rhs = opp_analize_time_eval(ctx, expr->logic_expr.right);
			
			if (lhs == NULL || rhs == NULL) return NULL;

			const int op = expr->logic_expr.tok;
			CLEAR_NODE(expr, lhs);
			expr->unary_expr.type = TINTEGER;

			switch (op)
			{
				case TEQEQ:  CMP_OP(==); break;
				case TNOTEQ: CMP_OP(!=); break;
				case TLT:    CMP_OP(<);  break;
				case TLE:    CMP_OP(<=); break;
				case TGT:    CMP_OP(>);  break;
				case TGE:    CMP_OP(>=); break;
				case TOR:    CMP_OP(||); break;
				case TAND:   CMP_OP(&&); break;
				default: break;
			}

			return expr;
		}

		case ESUB: {
			lhs = opp_analize_time_eval(ctx, expr->sub_expr.unary);
			
			if (lhs == NULL) return NULL;
			
			CLEAR_NODE(expr, lhs);
			if (lhs->unary_expr.type == TSTR)
				opp_semantics_error(ctx, expr, "Attempting to negate str '%s'",
					lhs->unary_expr.val.strval);

			if (lhs->unary_expr.type == TINTEGER)
				expr->unary_expr.val.i64val = -lhs->unary_expr.val.i64val;
			else
				expr->unary_expr.val.f64val = -lhs->unary_expr.val.f64val;

			return expr;
		}

		// TODO: Add sizeof here

		default: break;
	}
	return NULL;
}

// Assembly:
subq $0x78, %rsp
movq %rdi, 0x68(%rsp)
movq %rsi, 0x60(%rsp)
movq $0x0, 0x58(%rsp)
movq $0x0, 0x50(%rsp)
movq 0x60(%rsp), %rax
movl (%rax), %eax
decl %eax
movl %eax, %ecx
movq %rcx, 0x38(%rsp)
subl $0x5, %eax
ja 0x484d
movq 0x38(%rsp), %rax
leaq 0xfc0b(%rip), %rcx      # 0x13560
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x60(%rsp), %rax
cmpl $0x1, 0x10(%rax)
jne 0x3977
movq $0x0, 0x70(%rsp)
jmp 0x4858
movq 0x60(%rsp), %rax
movq %rax, 0x70(%rsp)
jmp 0x4858
movq 0x68(%rsp), %rdi
movq 0x60(%rsp), %rax
movq 0x20(%rax), %rsi
callq 0x3910
movq %rax, 0x58(%rsp)
movq 0x68(%rsp), %rdi
movq 0x60(%rsp), %rax
movq 0x18(%rax), %rsi
callq 0x3910
movq %rax, 0x50(%rsp)
cmpq $0x0, 0x58(%rsp)
je 0x39c6
cmpq $0x0, 0x50(%rsp)
jne 0x39d4
movq $0x0, 0x70(%rsp)
jmp 0x4858
movq 0x60(%rsp), %rax
movl 0x10(%rax), %eax
movl %eax, 0x44(%rsp)
movq 0x60(%rsp), %rax
movl 0x4(%rax), %eax
movl %eax, 0x48(%rsp)
movq 0x60(%rsp), %rax
movl 0x8(%rax), %eax
movl %eax, 0x4c(%rsp)
movq 0x60(%rsp), %rdi
xorl %esi, %esi
movl $0x48, %edx
callq 0x10f0
movq 0x60(%rsp), %rax
movl $0x5, (%rax)
movq 0x60(%rsp), %rax
movq 0x48(%rsp), %rcx
movq %rcx, 0x4(%rax)
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
je 0x3a38
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x3a46
movq 0x60(%rsp), %rax
movl $0x2, 0x10(%rax)
jmp 0x3a52
movq 0x60(%rsp), %rax
movl $0x3, 0x10(%rax)
movl 0x44(%rsp), %eax
addl $-0x13, %eax
movl %eax, %ecx
movq %rcx, 0x30(%rsp)
subl $0x4, %eax
ja 0x3e0c
movq 0x30(%rsp), %rax
leaq 0xfb23(%rip), %rcx      # 0x13598
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x3a94
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x3ae3
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x3ac2
movq 0x50(%rsp), %rax
cvttsd2si 0x18(%rax), %rcx
movq 0x58(%rsp), %rax
addq 0x18(%rax), %rcx
movq %rcx, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3ae1
movq 0x50(%rsp), %rax
movq 0x18(%rax), %rcx
movq 0x58(%rsp), %rax
addq 0x18(%rax), %rcx
movq %rcx, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3b39
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x3b14
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm0
movq 0x58(%rsp), %rax
addsd 0x18(%rax), %xmm0
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
jmp 0x3b37
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x58(%rsp), %rax
addsd 0x18(%rax), %xmm0
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
jmp 0x3b39
jmp 0x3e0e
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x3b54
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x3ba9
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x3b85
movq 0x50(%rsp), %rax
cvttsd2si 0x18(%rax), %rdx
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rcx
subq %rdx, %rcx
movq %rcx, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3ba7
movq 0x50(%rsp), %rax
movq 0x18(%rax), %rdx
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rcx
subq %rdx, %rcx
movq %rcx, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3c07
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x3bde
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm1
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
jmp 0x3c05
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
jmp 0x3c07
jmp 0x3e0e
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x3c22
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x3c73
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x3c51
movq 0x50(%rsp), %rax
cvttsd2si 0x18(%rax), %rcx
movq 0x58(%rsp), %rax
imulq 0x18(%rax), %rcx
movq %rcx, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3c71
movq 0x50(%rsp), %rax
movq 0x18(%rax), %rcx
movq 0x58(%rsp), %rax
imulq 0x18(%rax), %rcx
movq %rcx, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3cc9
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x3ca4
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm0
movq 0x58(%rsp), %rax
mulsd 0x18(%rax), %xmm0
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
jmp 0x3cc7
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x58(%rsp), %rax
mulsd 0x18(%rax), %xmm0
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
jmp 0x3cc9
jmp 0x3e0e
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x3ce4
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x3d57
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x3d24
movq 0x50(%rsp), %rax
cvttsd2si 0x18(%rax), %rcx
movq 0x58(%rsp), %rax
movq %rax, 0x28(%rsp)
movq 0x18(%rax), %rax
cqto
idivq %rcx
movq %rax, %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3d55
movq 0x50(%rsp), %rax
movq 0x18(%rax), %rcx
movq 0x58(%rsp), %rax
movq %rax, 0x20(%rsp)
movq 0x18(%rax), %rax
cqto
idivq %rcx
movq %rax, %rcx
movq 0x20(%rsp), %rax
movq %rcx, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3db5
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x3d8c
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm1
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
jmp 0x3db3
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
jmp 0x3db5
jmp 0x3e0e
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x3de5
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
je 0x3de5
movq 0x68(%rsp), %rdi
movq 0x60(%rsp), %rsi
leaq 0xfc68(%rip), %rdx      # 0x13a46
movb $0x0, %al
callq 0x2b10
movq 0x50(%rsp), %rax
movq 0x18(%rax), %rcx
movq 0x58(%rsp), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rax), %rax
cqto
idivq %rcx
movq 0x18(%rsp), %rax
movq %rdx, 0x18(%rax)
jmp 0x3e0e
jmp 0x3e0e
movq 0x60(%rsp), %rax
movq %rax, 0x70(%rsp)
jmp 0x4858
movq 0x68(%rsp), %rdi
movq 0x60(%rsp), %rax
movq 0x20(%rax), %rsi
callq 0x3910
movq %rax, 0x58(%rsp)
movq 0x68(%rsp), %rdi
movq 0x60(%rsp), %rax
movq 0x18(%rax), %rsi
callq 0x3910
movq %rax, 0x50(%rsp)
cmpq $0x0, 0x58(%rsp)
je 0x3e5d
cmpq $0x0, 0x50(%rsp)
jne 0x3e6b
movq $0x0, 0x70(%rsp)
jmp 0x4858
movq 0x60(%rsp), %rax
movl 0x10(%rax), %eax
movl %eax, 0x40(%rsp)
movq 0x60(%rsp), %rax
movl 0x4(%rax), %eax
movl %eax, 0x48(%rsp)
movq 0x60(%rsp), %rax
movl 0x8(%rax), %eax
movl %eax, 0x4c(%rsp)
movq 0x60(%rsp), %rdi
xorl %esi, %esi
movl $0x48, %edx
callq 0x10f0
movq 0x60(%rsp), %rax
movl $0x5, (%rax)
movq 0x60(%rsp), %rax
movq 0x48(%rsp), %rcx
movq %rcx, 0x4(%rax)
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
je 0x3ecf
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x3edd
movq 0x60(%rsp), %rax
movl $0x2, 0x10(%rax)
jmp 0x3ee9
movq 0x60(%rsp), %rax
movl $0x3, 0x10(%rax)
movq 0x60(%rsp), %rax
movl $0x2, 0x10(%rax)
movl 0x40(%rsp), %eax
addl $-0x7, %eax
movl %eax, %ecx
movq %rcx, 0x10(%rsp)
subl $0x7, %eax
ja 0x4718
movq 0x10(%rsp), %rax
leaq 0xf660(%rip), %rcx      # 0x13578
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x3f37
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x3f97
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x3f6f
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cvttsd2si 0x18(%rcx), %rcx
cmpq %rcx, %rax
sete %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x3f95
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cmpq 0x18(%rcx), %rax
sete %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4005
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x3fd6
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm1
ucomisd %xmm1, %xmm0
sete %al
setnp %cl
andb %cl, %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4003
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x50(%rsp), %rax
ucomisd 0x18(%rax), %xmm0
sete %al
setnp %cl
andb %cl, %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4005
jmp 0x471a
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x4020
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x4080
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x4058
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cvttsd2si 0x18(%rcx), %rcx
cmpq %rcx, %rax
setne %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x407e
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cmpq 0x18(%rcx), %rax
setne %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x40ee
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x40bf
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x40ec
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x50(%rsp), %rax
ucomisd 0x18(%rax), %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x40ee
jmp 0x471a
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x4109
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x4169
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x4141
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cvttsd2si 0x18(%rcx), %rcx
cmpq %rcx, %rax
setl %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4167
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cmpq 0x18(%rcx), %rax
setl %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x41d1
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x41a3
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm0
ucomisd %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x41cf
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm0
ucomisd %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x41d1
jmp 0x471a
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x41ec
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x424c
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x4224
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cvttsd2si 0x18(%rcx), %rcx
cmpq %rcx, %rax
setle %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x424a
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cmpq 0x18(%rcx), %rax
setle %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x42b4
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x4286
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm0
ucomisd %xmm1, %xmm0
setae %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x42b2
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm0
ucomisd %xmm1, %xmm0
setae %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x42b4
jmp 0x471a
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x42cf
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x432f
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x4307
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cvttsd2si 0x18(%rcx), %rcx
cmpq %rcx, %rax
setg %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x432d
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cmpq 0x18(%rcx), %rax
setg %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4393
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x4369
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm1
ucomisd %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4391
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x50(%rsp), %rax
ucomisd 0x18(%rax), %xmm0
seta %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4393
jmp 0x471a
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x43ae
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x440e
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x43e6
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cvttsd2si 0x18(%rcx), %rcx
cmpq %rcx, %rax
setge %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x440c
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x50(%rsp), %rcx
cmpq 0x18(%rcx), %rax
setge %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4472
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x4448
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm1
ucomisd %xmm1, %xmm0
setae %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4470
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq 0x50(%rsp), %rax
ucomisd 0x18(%rax), %xmm0
setae %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4472
jmp 0x471a
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x4491
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x4518
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x44db
movq 0x58(%rsp), %rcx
movb $0x1, %al
cmpq $0x0, 0x18(%rcx)
movb %al, 0xf(%rsp)
jne 0x44c4
movq 0x50(%rsp), %rax
cvttsd2si 0x18(%rax), %rax
cmpq $0x0, %rax
setne %al
movb %al, 0xf(%rsp)
movb 0xf(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4513
movq 0x58(%rsp), %rcx
movb $0x1, %al
cmpq $0x0, 0x18(%rcx)
movb %al, 0xe(%rsp)
jne 0x44fe
movq 0x50(%rsp), %rax
cmpq $0x0, 0x18(%rax)
setne %al
movb %al, 0xe(%rsp)
movb 0xe(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x45c2
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x4573
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movb $0x1, %al
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movb %al, 0xd(%rsp)
jne 0x455c
jp 0x455c
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
movb %al, 0xd(%rsp)
movb 0xd(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x45c0
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movb $0x1, %al
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movb %al, 0xc(%rsp)
jne 0x45ab
jp 0x45ab
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
movb %al, 0xc(%rsp)
movb 0xc(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x45c2
jmp 0x471a
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
je 0x45e1
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x4668
movq 0x50(%rsp), %rax
cmpl $0x3, 0x10(%rax)
jne 0x462b
movq 0x58(%rsp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x18(%rcx)
movb %al, 0xb(%rsp)
je 0x4614
movq 0x50(%rsp), %rax
cvttsd2si 0x18(%rax), %rax
cmpq $0x0, %rax
setne %al
movb %al, 0xb(%rsp)
movb 0xb(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4663
movq 0x58(%rsp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x18(%rcx)
movb %al, 0xa(%rsp)
je 0x464e
movq 0x50(%rsp), %rax
cmpq $0x0, 0x18(%rax)
setne %al
movb %al, 0xa(%rsp)
movb 0xa(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4716
movq 0x50(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x46c5
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
xorl %eax, %eax
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movb %al, 0x9(%rsp)
jne 0x4690
jp 0x4690
jmp 0x46ae
movq 0x50(%rsp), %rax
cvtsi2sdq 0x18(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
movb %al, 0x9(%rsp)
movb 0x9(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4714
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
xorl %eax, %eax
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movb %al, 0x8(%rsp)
jne 0x46e2
jp 0x46e2
jmp 0x46ff
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
movb %al, 0x8(%rsp)
movb 0x8(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4716
jmp 0x471a
jmp 0x471a
movq 0x60(%rsp), %rax
movq %rax, 0x70(%rsp)
jmp 0x4858
movq 0x68(%rsp), %rdi
movq 0x60(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x3910
movq %rax, 0x58(%rsp)
cmpq $0x0, 0x58(%rsp)
jne 0x4757
movq $0x0, 0x70(%rsp)
jmp 0x4858
movq 0x60(%rsp), %rax
movl 0x4(%rax), %eax
movl %eax, 0x48(%rsp)
movq 0x60(%rsp), %rax
movl 0x8(%rax), %eax
movl %eax, 0x4c(%rsp)
movq 0x60(%rsp), %rdi
xorl %esi, %esi
movl $0x48, %edx
callq 0x10f0
movq 0x60(%rsp), %rax
movl $0x5, (%rax)
movq 0x60(%rsp), %rax
movq 0x48(%rsp), %rcx
movq %rcx, 0x4(%rax)
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
je 0x47af
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x47bd
movq 0x60(%rsp), %rax
movl $0x2, 0x10(%rax)
jmp 0x47c9
movq 0x60(%rsp), %rax
movl $0x3, 0x10(%rax)
movq 0x58(%rsp), %rax
cmpl $0x5, 0x10(%rax)
jne 0x47f5
movq 0x68(%rsp), %rdi
movq 0x60(%rsp), %rsi
movq 0x58(%rsp), %rax
movq 0x18(%rax), %rcx
leaq 0xf288(%rip), %rdx      # 0x13a76
movb $0x0, %al
callq 0x2b10
movq 0x58(%rsp), %rax
cmpl $0x2, 0x10(%rax)
jne 0x4816
movq 0x58(%rsp), %rax
xorl %ecx, %ecx
subq 0x18(%rax), %rcx
movq 0x60(%rsp), %rax
movq %rcx, 0x18(%rax)
jmp 0x4841
movq 0x58(%rsp), %rax
movsd 0x18(%rax), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movq 0x60(%rsp), %rax
movsd %xmm0, 0x18(%rax)
movq 0x60(%rsp), %rax
movq %rax, 0x70(%rsp)
jmp 0x4858
jmp 0x484f
movq $0x0, 0x70(%rsp)
movq 0x70(%rsp), %rax
addq $0x78, %rsp
retq
nopw %cs:(%rax,%rax)