// File: /workspace/github_c_makefile_star2_O3/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
pushq %rax
movl %r8d, %ebp
movl %ecx, %r12d
movq %rdx, %r13
movq %rsi, %r14
movq %rdi, %r15
callq 0x7394
movq %rax, %rbx
movq %r13, (%rax)
movl %r12d, 0x8(%rax)
movl %ebp, 0x14(%rax)
movl 0x14(%r15), %ecx
movl 0x14(%r14), %eax
leal (%rax,%rcx), %edx
cmpl %ebp, %edx
jne 0x7e22
xorl %edx, %edx
testl %ecx, %ecx
movl $0x0, %r12d
cmovgl %ecx, %r12d
movl 0xc(%r14), %edi
addl %edi, %r12d
movl 0xc(%r15), %esi
cmpl %esi, %r12d
cmovlel %esi, %r12d
testl %eax, %eax
cmovgl %eax, %edx
leal (%rsi,%rdx), %r13d
cmpl %edi, %r13d
cmovlel %edi, %r13d
cmpl %r13d, %r12d
movl %r13d, %r8d
cmovll %r12d, %r8d
cmpl %edi, %esi
movl %edi, %r9d
cmovgl %esi, %r9d
cmpl %ebp, %r9d
cmovlel %ebp, %r9d
cmpl %r9d, %r8d
jg 0x7e31
movb $0x2, 0x18(%rbx)
cmpl %r13d, %r12d
jge 0x7ea5
movq %r15, %rcx
movq %r14, %rdx
jmp 0x7ecd
movl 0xc(%r15), %esi
movl 0xc(%r14), %edi
xorl %edx, %edx
testl %eax, %eax
cmovgl %eax, %edx
cmpl %ebp, %edi
cmovgl %edi, %ebp
cmpl %ebp, %esi
cmovgl %esi, %ebp
movl %ebp, 0xc(%rbx)
cmpl %edx, %ecx
jle 0x7e4a
movq %r15, %rdx
movq %r14, %rsi
jmp 0x7e79
xorl %esi, %esi
testl %ecx, %ecx
cmovgl %ecx, %esi
cmpl %edx, %esi
jne 0x7e71
movl 0x8(%r14), %edx
cmpl %edx, 0x8(%r15)
jg 0x7e42
jne 0x7e71
movl 0x10(%r15), %edi
movq %r15, %rdx
movq %r14, %rsi
cmpl 0x10(%r14), %edi
jle 0x7e79
movl %ecx, %eax
movq %r14, %rdx
movq %r15, %rsi
movl 0x10(%r15), %ecx
movl 0x10(%r14), %edi
cmpl %edi, %ecx
cmovgl %ecx, %edi
cmpl %edi, %eax
cmovgl %eax, %edi
movl %edi, 0x10(%rbx)
incl 0x1c(%rdx)
movq %rdx, 0x20(%rbx)
incl 0x1c(%rsi)
movq %rsi, 0x28(%rbx)
movb $0x1, 0x18(%rbx)
movq %rbx, %rax
jmp 0x7f05
jne 0x7ec4
movq (%r14), %rdi
movl 0x8(%r14), %esi
movq (%r15), %rdx
movl 0x8(%r15), %ecx
callq 0x28a5
movq %r15, %rcx
movq %r14, %rdx
testl %eax, %eax
jne 0x7ecd
movl %r13d, %r12d
movq %r14, %rcx
movq %r15, %rdx
movl %r12d, 0xc(%rbx)
incl 0x1c(%rcx)
movq %rcx, 0x28(%rbx)
incl 0x1c(%rdx)
movq %rdx, 0x20(%rbx)
movl 0x10(%r15), %eax
movl 0x10(%r14), %ecx
cmpl %ecx, %eax
cmovgl %eax, %ecx
movl %ecx, 0x10(%rbx)
movq %rbx, %rdi
callq 0x7c70
movq %rax, %r14
movq %rbx, %rdi
callq 0x7447
movq %r14, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq