// File: /workspace/github_c_makefile_star2_O3/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
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x10, %rsp
movq %rdx, %rbx
movq %rsi, %r15
movq %rdi, %r14
movq (%rsi), %rcx
testq %rcx, %rcx
je 0x2e2e
movq 0x20(%rcx), %rax
testq %rax, %rax
je 0x2db2
movsd 0x8(%rax), %xmm2
subsd %xmm0, %xmm2
andpd 0x13e6(%rip), %xmm2     # 0x4140
movsd 0x13ee(%rip), %xmm3     # 0x4150
ucomisd %xmm2, %xmm3
jbe 0x2d83
movsd 0x10(%rax), %xmm2
subsd %xmm1, %xmm2
andpd 0x13c7(%rip), %xmm2     # 0x4140
ucomisd %xmm2, %xmm3
ja 0x2e88
movl (%r14), %ebp
incl %ebp
movl %ebp, (%r14)
movl $0x1, %edi
movl $0x10, %esi
movsd %xmm1, 0x8(%rsp)
movsd %xmm0, (%rsp)
jmp 0x2e4b
movq 0x20(%rcx), %rax
testq %rax, %rax
jne 0x2e95
movq %rcx, %rbx
movsd (%rcx), %xmm3
ucomisd %xmm0, %xmm3
jbe 0x2dd0
movsd 0x8(%rbx), %xmm2
movl $0x28, %r15d
ucomisd %xmm1, %xmm2
ja 0x2e15
ucomisd %xmm3, %xmm0
jb 0x2de7
movsd 0x8(%rbx), %xmm2
movl $0x30, %r15d
ucomisd %xmm1, %xmm2
ja 0x2e15
ucomisd %xmm0, %xmm3
jbe 0x2dfa
movl $0x38, %r15d
ucomisd 0x8(%rbx), %xmm1
jae 0x2e15
ucomisd %xmm3, %xmm0
jb 0x2e9d
movl $0x40, %r15d
ucomisd 0x8(%rbx), %xmm1
jb 0x2e9d
movq (%rbx,%r15), %rcx
testq %rcx, %rcx
jne 0x2da5
movsd %xmm0, (%rsp)
movsd %xmm1, 0x8(%rsp)
addq %rbx, %r15
jmp 0x2e39
movsd %xmm0, (%rsp)
movsd %xmm1, 0x8(%rsp)
movl (%r14), %ebp
incl %ebp
movl %ebp, (%r14)
movl $0x1, %edi
movl $0x10, %esi
callq 0x10c0
movq %rax, %r12
movl %ebp, %edi
movsd (%rsp), %xmm0
movsd 0x8(%rsp), %xmm1
callq 0x1dbd
movq %rax, (%r12)
movq 0x8(%r14), %rcx
movq %rcx, 0x8(%r12)
movq %r12, 0x8(%r14)
movq %rax, %rdi
movq %r15, %rsi
movq %rbx, %rdx
callq 0x2a24
movq (%r12), %rax
addq $0x10, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
addq %rbx, %r15
jmp 0x2d49
xorl %eax, %eax
jmp 0x2e88