Je suis avec un cryptage de 128 bits compteur de nombre entier dans la très intérieur des boucles de mon code C++. (Pas pertinent d'arrière-plan: L'application est en train d'évaluer des différences finies équations sur une grille régulière, ce qui implique de façon répétitive l'incrémentation de grands nombres entiers, et même 64 bits n'est pas assez de précision, parce que les petits arrondissement accumule suffisamment pour influer sur les réponses.)
J'ai représenté la entier comme deux 64 bits unsigned longs. J'ai maintenant besoin d'un accroissement de ces valeurs par un cryptage de 128 bits constant. Ce n'est pas difficile, mais vous devez manuellement attraper le report de la faible mot pour mot haut.
J'ai du code qui fonctionne quelque chose comme ceci:
inline void increment128(unsigned long &hiWord, unsigned long &loWord)
{
const unsigned long hiAdd=0x0000062DE49B5241;
const unsigned long loAdd=0x85DC198BCDD714BA;
loWord += loAdd;
if (loWord < loAdd) ++hiWord; // test_and_add_carry
hiWord += hiAdd;
}
C'est serré et simple code. Elle fonctionne.
Malheureusement, c'est environ 20% de mon temps d'exécution. Le tueur est que loWord test. Si je le supprime, je suis évidemment d'obtenir de mauvaises réponses, mais la gestion d'exécution des gouttes de 20% à 4%! Alors que porter de test est particulièrement cher!
Ma question: est-ce que C++ exposer le matériel à transporter de drapeaux, de même qu'une extension de GCC? Il semble que les ajouts pouvait se faire sans le tester et ajoutez-porter ligne ci-dessus, si le compilé des instructions d'un complément à l'aide de la dernière effectuer des instructions pour l'hiWord plus. Est-il un moyen de reprendre le test-and-add-porter ligne pour obtenir le compilateur d'utiliser la valeur intrinsèque de l'opcode?