// File: /workspace/github_c_makefile_star2_O0/trumabrat[P]GrandProjet/ArbreQuat.c
// Function: rechercheCreeNoeudArbre
Noeud *rechercheCreeNoeudArbre(Reseau *R, ArbreQuat **a, ArbreQuat *parent, double x, double y){
    if ((*a)==NULL){
        //On doit insérér le noeud x,y dans l'arbre ainsi que dans reseau

        //insertion dans le reseau
        R->nbNoeuds++;
        CellNoeud *new = (CellNoeud*) calloc(1, sizeof(CellNoeud));
        new->nd = creerNoeud(R->nbNoeuds, x, y);
        new->suiv = R->noeuds;
        R->noeuds = new;


        //insertion dans l'arbre
        insererNoeudArbre(new->nd, a, parent);

        return new->nd;
    }

    else{
        if ((*a)->noeud != NULL){
            if (fabs((*a)->noeud->x - x) < DOUBLE_PRECISION  && fabs((*a)->noeud->y - y) < DOUBLE_PRECISION){
                //Le noeud existe dans l'arbre et donc dans le réseau, on retourne le noeud
                return (*a)->noeud;
            }
            else{
                //Le noeud n'existe pas dans l'arbre car on est arrivé a une feuille et le if n'est pas vérifié.
                //On ajoute au réseau
                R->nbNoeuds++;
                CellNoeud *new = (CellNoeud*) calloc(1,sizeof(CellNoeud));
                new->nd = creerNoeud(R->nbNoeuds, x, y);
                new->suiv = R->noeuds;
                R->noeuds = new;

                //On ajoute dans l'arbre
                insererNoeudArbre(new->nd, a, parent);

                return new->nd;
            }
        }
        else{
            //On continue de chercher jusqu'a ce qu'on arrive a une feuille ou place libre
            //On doit déterminer dans lequel des enfants on doit chercher

            //cas sud-ouest
            if (x < (*a)->xc && y < (*a)->yc)
            {
                return rechercheCreeNoeudArbre(R, &((*a)->so), *a, x, y);
            }

            //cas sud-est
            if (x >= (*a)->xc && y < (*a)->yc){
               return rechercheCreeNoeudArbre(R, &((*a)->se), *a, x, y);
            }

            //cas nord-ouest
            if (x < (*a)->xc && y >= (*a)->yc){
                return rechercheCreeNoeudArbre(R, &((*a)->no), *a, x, y);
            }

            //cas nord-est
            if(x >= (*a)->xc && y >= (*a)->yc){
                return rechercheCreeNoeudArbre(R, &((*a)->ne), *a, x, y);
            }
        }
    }

    //Pour que le compilateur ne fait pas de pb, j'amais verifié
    return NULL;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movsd %xmm0, -0x28(%rbp)
movsd %xmm1, -0x30(%rbp)
movq -0x18(%rbp), %rax
cmpq $0x0, (%rax)
jne 0x3be5
movq -0x10(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movl $0x1, %edi
movl $0x10, %esi
callq 0x10b0
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %edi
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
callq 0x23a0
movq %rax, %rcx
movq -0x38(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x36d0
movq -0x38(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0x3e46
movq -0x18(%rbp), %rax
movq (%rax), %rax
cmpq $0x0, 0x20(%rax)
je 0x3ce4
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rax), %rax
movsd 0x8(%rax), %xmm1
subsd -0x28(%rbp), %xmm1
movaps 0x153d(%rip), %xmm0     # 0x5150
pand %xmm0, %xmm1
movsd 0x1521(%rip), %xmm0     # 0x5140
ucomisd %xmm1, %xmm0
jbe 0x3c67
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rax), %rax
movsd 0x10(%rax), %xmm1
subsd -0x30(%rbp), %xmm1
movaps 0x150f(%rip), %xmm0     # 0x5150
pand %xmm0, %xmm1
movsd 0x14f3(%rip), %xmm0     # 0x5140
ucomisd %xmm1, %xmm0
jbe 0x3c67
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0x3e46
movq -0x10(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
movl $0x1, %edi
movl $0x10, %esi
callq 0x10b0
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %edi
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
callq 0x23a0
movq %rax, %rcx
movq -0x40(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x40(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x40(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x36d0
movq -0x40(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0x3e46
movsd -0x28(%rbp), %xmm1
movq -0x18(%rbp), %rax
movq (%rax), %rax
movsd (%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3d3f
movsd -0x30(%rbp), %xmm1
movq -0x18(%rbp), %rax
movq (%rax), %rax
movsd 0x8(%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3d3f
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq (%rax), %rsi
addq $0x28, %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
callq 0x3b40
movq %rax, -0x8(%rbp)
jmp 0x3e46
movsd -0x28(%rbp), %xmm0
movq -0x18(%rbp), %rax
movq (%rax), %rax
ucomisd (%rax), %xmm0
jb 0x3d96
movsd -0x30(%rbp), %xmm1
movq -0x18(%rbp), %rax
movq (%rax), %rax
movsd 0x8(%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3d96
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq (%rax), %rsi
addq $0x30, %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
callq 0x3b40
movq %rax, -0x8(%rbp)
jmp 0x3e46
movsd -0x28(%rbp), %xmm1
movq -0x18(%rbp), %rax
movq (%rax), %rax
movsd (%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3dea
movsd -0x30(%rbp), %xmm0
movq -0x18(%rbp), %rax
movq (%rax), %rax
ucomisd 0x8(%rax), %xmm0
jb 0x3dea
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq (%rax), %rsi
addq $0x38, %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
callq 0x3b40
movq %rax, -0x8(%rbp)
jmp 0x3e46
movsd -0x28(%rbp), %xmm0
movq -0x18(%rbp), %rax
movq (%rax), %rax
ucomisd (%rax), %xmm0
jb 0x3e3a
movsd -0x30(%rbp), %xmm0
movq -0x18(%rbp), %rax
movq (%rax), %rax
ucomisd 0x8(%rax), %xmm0
jb 0x3e3a
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq (%rax), %rsi
addq $0x40, %rsi
movq -0x18(%rbp), %rax
movq (%rax), %rdx
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
callq 0x3b40
movq %rax, -0x8(%rbp)
jmp 0x3e46
jmp 0x3e3c
jmp 0x3e3e
movq $0x0, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq