// File: /workspace/github_c_makefile_star2_O1/cbouilla[P]AES-attacks-finder/Solver.c
// Function: UnionSolver_tmp
Solver UnionSolver_tmp(Solver B1, Solver B2, int *X, const int n, const int sortie) // Réalise l'union de deux solvers. (Appelée par UnionSolver)
{	
	#if 0 // traité dans UnionSolver
	/* Cas où une solver est contenue dans l'autre */
	if (n==B1->Nvar)
	{
		free(X);
		if (PlusInteressant(B2,B1)) return copySolver(B2);
		else return copySolver(B1);
	}
	if (n==B2->Nvar)
	{
		free(X);
		return copySolver(B2);
	}
	#endif
	
	Solver __restrict B = NewSolver();
	B->var=X;
	B->Nvar=n;
	B->sortie=sortie;
	
	/* Cas où les deux solvers sont indépendantes (E(X1 u X2) = E(X1) + E(X2)) */
	if (B->sortie==B1->sortie + B2->sortie)
	{
		const int t1=max(max(B1->sortie,0) + B2->temps, B1->temps);
		const int t2=max(max(B2->sortie,0) + B1->temps, B2->temps);
		if (min(t1,t2)<=max(sortie,max(B1->temps,B2->temps)))
		{
			B->type=2;
			if (t1<t2 || (t1==t2 && OrdreListe(B2->var,B2->Nvar,B1->var,B1->Nvar)))
			{
				B->temps=t1;
				B->fils2=copySolver(B1);
				B->fils1=copySolver(B2);
			}
			else
			{
				B->temps=t2;
				B->fils2=copySolver(B2);
				B->fils1=copySolver(B1);
			}
			B->memoire=max(B1->memoire,B2->memoire);
			Solver tmp=SimplifierTypeSolver(B);
			freeSolver(B);
			return tmp;
		}
	}
	/* Cas où les deux solvers sont de type A -> B et A -> C */
	/*if (B1->type==2 && B2->type==2 && SameSolvers(B1->fils2,B2->fils2))
	{
		if (B1->fils2->temps<B2->fils2->temps || (B1->fils2->temps==B2->fils2->temps && B1->fils2->memoire<B2->fils2->memoire)) B->fils2=copySolver(B1->fils2);
		else B->fils2=copySolver(B2->fils2);
		int n_tmp;
		int *X_tmp=UnionListesTriees(B1->fils1->var,B1->fils1->Nvar,B2->fils1->var,B2->fils1->Nvar,&n_tmp);
		B->fils1=UnionSolver_tmp(B1->fils1,B2->fils1,X_tmp,n,B->sortie-B->fils2->sortie);
		B->temps=max(B->fils1->temps+max(B->fils2->sortie,0),B->fils2->temps);
		B->memoire=max(B->fils1->memoire,B->fils2->memoire);
		B->type=2;		
		Solver tmp=SimplifierTypeSolver(B);
		freeSolver(B);
		return tmp;
	}	
	else*/
	{
		/* Cas où l'on utilise de la mémoire */
		B->temps=max(B1->temps,max(B2->temps,B->sortie));
		if (max(B1->sortie,0)>max(B2->sortie,0) || (max(B1->sortie,0)==max(B2->sortie,0)  && (B1->Nvar>B2->Nvar || (B1->Nvar==B2->Nvar && B1->memoire<=B2->memoire))))
		{
			B->memoire=max(B2->sortie,max(B1->memoire,B2->memoire));
			B->fils1=copySolver(B1);
			B->fils2=copySolver(B2);
		}
		else
		{
			B->memoire=max(B1->sortie,max(B1->memoire,B2->memoire));
			B->fils1=copySolver(B2);
			B->fils2=copySolver(B1);
		}
		B->type=1;
		return B;
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movl %r8d, %ebp
movl %ecx, %r12d
movq %rdx, %r13
movq %rsi, %rbx
movq %rdi, %r14
callq 0x6fb4
movq %r14, %r9
movq %rbx, %r8
movq %rax, %r14
movq %r13, (%rax)
movl %r12d, 0x8(%rax)
movl %ebp, 0x14(%rax)
movl 0x14(%r9), %r15d
movl 0x14(%rbx), %eax
leal (%rax,%r15), %ecx
cmpl %ebp, %ecx
jne 0x7af9
xorl %ebx, %ebx
testl %r15d, %r15d
cmovlel %ebx, %r15d
movl 0xc(%r8), %r13d
addl %r13d, %r15d
movl 0xc(%r9), %ecx
cmpl %ecx, %r15d
cmovlel %ecx, %r15d
testl %eax, %eax
cmovgl %eax, %ebx
addl %ecx, %ebx
cmpl %r13d, %ebx
cmovlel %r13d, %ebx
cmpl %ebx, %r15d
movl %ebx, %eax
cmovll %r15d, %eax
cmpl %r13d, %ecx
cmovgl %ecx, %r13d
cmpl %ebp, %r13d
cmovlel %ebp, %r13d
cmpl %r13d, %eax
jg 0x7af4
movb $0x2, 0x18(%r14)
cmpl %ebx, %r15d
movq %r8, 0x10(%rsp)
movq %r9, %rbp
movl %eax, 0xc(%rsp)
jl 0x7aa4
jne 0x7bc1
movq (%r8), %rdi
movl 0x8(%r8), %esi
movq (%r9), %rdx
movl 0x8(%r9), %ecx
callq 0x2796
movq %rbp, %r9
movq 0x10(%rsp), %r8
testl %eax, %eax
je 0x7bc1
movl %r15d, 0xc(%r14)
testq %r9, %r9
je 0x7ab1
incl 0x1c(%r9)
movq %r9, 0x28(%r14)
movq %r8, %rax
testq %r8, %r8
je 0x7ac0
incl 0x1c(%rax)
movq %rax, 0x20(%r14)
movl 0x10(%r9), %eax
movl 0x10(%r8), %ecx
cmpl %ecx, %eax
cmovgl %eax, %ecx
movl %ecx, 0x10(%r14)
movq %r14, %rdi
callq 0x78b8
movq %rax, %r12
movq %r14, %rdi
callq 0x7060
movq %rbp, %r9
movq 0x10(%rsp), %r8
movl 0xc(%rsp), %eax
cmpl %r13d, %eax
jle 0x7b63
movl 0xc(%r9), %eax
movl 0xc(%r8), %ecx
movl 0x14(%r14), %edx
cmpl %edx, %ecx
cmovgl %ecx, %edx
cmpl %edx, %eax
cmovgl %eax, %edx
movl %edx, 0xc(%r14)
movl 0x14(%r9), %eax
movl 0x14(%r8), %ecx
xorl %edx, %edx
testl %ecx, %ecx
movl $0x0, %esi
cmovgl %ecx, %esi
cmpl %esi, %eax
jle 0x7b75
movl 0x10(%r9), %eax
movl 0x10(%r8), %edx
cmpl %edx, %eax
cmovgl %eax, %edx
cmpl %edx, %ecx
cmovgl %ecx, %edx
movl %edx, 0x10(%r14)
testq %r9, %r9
je 0x7b4a
incl 0x1c(%r9)
movq %r9, 0x20(%r14)
testq %r8, %r8
je 0x7b57
incl 0x1c(%r8)
movq %r8, 0x28(%r14)
movb $0x1, 0x18(%r14)
movq %r14, %r12
movq %r12, %rax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
testl %eax, %eax
cmovgl %eax, %edx
cmpl %esi, %edx
jne 0x7b94
movl 0x8(%r8), %edx
cmpl %edx, 0x8(%r9)
jg 0x7b2b
jne 0x7b94
movl 0x10(%r9), %edx
cmpl 0x10(%r8), %edx
jle 0x7b2b
movl 0x10(%r9), %ecx
movl 0x10(%r8), %edx
cmpl %edx, %ecx
cmovgl %ecx, %edx
cmpl %edx, %eax
cmovgl %eax, %edx
movl %edx, 0x10(%r14)
testq %r8, %r8
je 0x7bb3
incl 0x1c(%r8)
movq %r8, 0x20(%r14)
movq %r9, %r8
testq %r9, %r9
jne 0x7b53
jmp 0x7b57
movl %ebx, 0xc(%r14)
testq %r8, %r8
je 0x7bce
incl 0x1c(%r8)
movq %r8, 0x28(%r14)
movq %r9, %rax
testq %r9, %r9
jne 0x7abd
jmp 0x7ac0