3 votes

Code optimisé en VC++ et ASM

Bonsoir. Désolé, j'ai utilisé google tradutor. J'utilise NASM dans VC ++ sur x86 et j'apprends à utiliser MASM sur x64.

Existe-t-il un moyen de spécifier l'emplacement de chaque argument et du retour d'une fonction d'assemblage de telle sorte que le compilateur parvienne à y laisser les données de la manière la plus rapide ? On peut aussi spécifier quels registres seront utilisés de sorte que le compilateur sache quelles données sont encore sauvegardées pour en faire le meilleur usage ?

Par exemple, comme il n'existe pas de fonction intrinsèque qui applique exactement l'IDIV r/m64 (division d'entiers signés de 64 bits en langage assembleur), nous devrons peut-être l'implémenter. L'IDIV exige que la partie basse du dividende/numérateur soit dans RAX, la partie haute dans RDX et le diviseur/dénominateur dans un registre quelconque ou dans une région de la mémoire. À la fin, le quotient est dans EAX et le reste dans EDX. On peut donc vouloir développer des fonctions ainsi (je mets des inutilités pour exemplifier) :

void DivLongLongInt( long long NumLow , long long NumHigh , long long Den , long long *Quo , long long *Rem ){
    __asm(
        // Specify used register: [rax], specify pre location: NumLow --> [rax]
        reg(rax)=NumLow ,
        // Specify used register: [rdx], specify  pre location: NumHigh --> [rdx]
        reg(rdx)=NumHigh ,
        // Specify required memory: memory64bits [den], specify pre location: Den --> [den]
        mem[64](den)=Den ,
        // Specify used register: [st0], specify pre location: Const(12.5) --> [st0]
        reg(st0)=25*0.5 ,
        // Specify used register: [bh]
        reg(bh) ,
        // Specify required memory: memory64bits [nothing]
        mem[64](nothing) ,
        // Specify used register: [st1]
        reg(st1)
    ){
        // Specify code
        IDIV [den]
    }(
        // Specify pos location: [rax] --> *Quo
        *Quo=reg(rax) ,
        // Specify pos location: [rdx] --> *Rem
        *Rem=reg(rdx)
    ) ;
}

Est-il possible de faire quelque chose d'au moins proche de cela ? Merci pour toute aide.

S'il n'y a aucun moyen de le faire, c'est dommage car ce serait certainement un excellent moyen d'implémenter des fonctions de haut niveau avec des caractéristiques de niveau assembleur. Je pense que c'est une simple interface entre C ++ et ASM qui devrait déjà exister et permettre au code assembleur d'être intégré en ligne et à haut niveau, pratiquement comme du simple code C++.

0voto

geza Points 13730

Non, il n'est pas possible de le faire. MSVC ne prend pas en charge l'assemblage en ligne pour les constructions x64. A la place, vous devez utiliser des intrinsèques ; presque tout est disponible. Ce qui est triste, c'est que, pour autant que je sache, le 128 bits idiv est manquant dans les intrinsèques.

Remarque : vous pouvez résoudre votre problème avec deux mov (pour placer les entrées dans les bons registres). Et vous ne devriez pas vous inquiéter de cela ; les CPU actuels gèrent les mov muy bien. Mettez mov dans un code peut ne pas le ralentir du tout. Et div est très coûteux par rapport à un mov donc ça n'a pas trop d'importance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X