Y a-t-il un moyen d'obtenir SLIG, GCC ou VS pour générer des instructions ADC (ajoutez-vous avec transport) uniquement à l'aide de Standard-C ++ (98/11/14)? (Edit: Je veux dire en mode x64, désolé si ce n'était pas clair.) P>
3 Réponses :
Si vous compilez une addition signée 64 bits pour x86 ( EDIT: CODE Exemple: p> sur x86, l'addition est implémentée à l'aide d'une instruction code> Ajouter code> suivie d'un instruction intz_t code> in c ++ 11), le code compilé contiendra une instruction code> adc code>.
adc code>. Sur x64, seule une seule instruction
Ajouter code> est utilisée. P> p>
Pouvez-vous donner une fonction d'exemple minimale? Je ne l'ai jamais vu dans aucun de mes binaires, seulement lea (Q) et similaire.
S'il vous plaît voir mon édition, j'aurais dû inclure cela avant. L'arrière-plan ici est de voir s'il est possible de construire une entière arbitraire efficace arithmétique en standard-C ++. :)
Il y a un type En outre, ce code ISO C pur peut compiler à un ADC: P> __ int128_t code> disponible sur GCC pour AMD64 et d'autres cibles 64 bits, qui utilisera une paire de
ajouter code> /
ADC code> Ajout simple. (Voir le lien Godbolt ci-dessous).
mov rax, rdi # a, a
add rax, rsi # a, b
adc rax, 0 # a,
ret
J'allais ajouter que je pense que -Funsafe-math-math-optimisations code> pourrait tuer ce total
si code> bloc, mais cela ne semble pas. Je pense que C pourrait permettre une telle optimisation, cependant, alors regarde là-bas.
Un emballage non signé est bien défini en C / C ++, en tant qu'iertiper binaire. Il est garanti de fonctionner correctement. -Funsafe-Math-Optimisations Code> n'affecte que le comportement des points flottants. Peut-être que vous envisagez d'avoir un comportement indéfini en integer
-fwrapv code> le rend bien défini (comme le complément de 2 2), mais est pas i> activé par défaut.
Si votre code fait une comparaison et ajoute le résultat de la comparaison à quelque chose, un assemble à p> Cependant, il est un peu délicat pour obtenir GCC pour vraiment émettre un ADC code> est généralement émis par GCC 5 (Incidemment, GCC 4.8 n'émet pas d'un
ADC code> ici). Par exemple,
adc < / code>. p> p>
Yup, il est difficile d'obtenir GCC d'émettre ADC code> pour incréments conditionnels comme ce qui précède. Je pense i> GCC a un peephole ou une autre étape qui prend un
ADC code> avec un
0 code> immédiat et se transforme en un (généralement pire sur le matériel moderne) < Code> Xor EAX, EAX; Setb al; Ajouter ..., EAX CODE> Séquence. Par exemple, si vous supprimez
b code> de ce qui précède, il est
(A + (C
adc Code> avec
0 code> mais GCC fait l'étrange
seteb code> chose. Idem pour expression ternaire comme
a + = (c
a + = (c
ADC EAX, 2 code>.
Donc, il ne semble que lorsque 0 code> serait l'immédiat que cela fait cette étrangeté. De plus, si vous utilisez une branche, comme
si (c
adc code>! J'ai essayé de nombreux exemples sur Godbolt .
Ce sont des compilateurs
C code>
@Taylor: "GCC" et "Visual Studio" sont les noms des collections de compilateur contenant des compilateurs C ++ entre autres.
Clang code> est un compilateur C ++.
@Benvoigt Oh, alors je suppose que cela a du sens.
FWIW, en x64, j'ai jamais i> pu être capable d'obtenir n'importe quel compilateur de générer
adc code> sans assemblage en ligne.
Y a-t-il une raison particulière que vous voulez faire cela?
Vous pouvez jouer avec l'explorateur GCC, peut-être que cela vous mènera quelque part.
L'ensemble du point de C ou C ++ est d'isoler le programmeur de l'assemblage spécifique à la plate-forme. Les normes C ou C ++ ne mentionnent jamais ADC (qui est un détail de mise en œuvre) afin que la réponse soit nul b>. Rien ne garantit qu'un processeur particulier fournit une instruction ADC ...
Un no non. mais i>, il peut y avoir des extensions de compilateur susceptibles de générer un, par exemple, __ Basculin_Addc fonctions.
@syam je n'ai jamais voulu une garantie. Je suis juste à la recherche d'exemples de code qui incluent suffisamment de conseils pour l'optimiseur pour générer une instruction ADC.
@Olicharlesworth Oui, j'aimerais mettre en œuvre des arithmétiques de précision arbitraires efficaces dans Iso-C ++, mais je ne pense pas que ce soit possible pour le moment.
Le problème est également lié à Stackoverflow.com/Questtions/56101507/...
Le problème est également lié à Stackoverflow.com/Questtions/56101507/...