Gibt es bei der Arbeit mit Arithmetik mit beliebiger Genauigkeit (z. B. 512-Bit-Ganzzahlen) eine Möglichkeit, GCC dazu zu bringen, ADC und ähnliche Anweisungen zu verwenden, ohne Inline-Assemblierung zu verwenden?
Ein erster Blick auf den Quellcode von GMP zeigt, dass sie einfach Assemblierungsimplementierungen für jede unterstützte Plattform haben.
Hier ist der Testcode, den ich geschrieben habe, der zwei 128-Bit-Zahlen von der Befehlszeile hinzufügt und das Ergebnis ausgibt. (Inspiriert von mini-gmp add_n):
%Vor% GCC -O3 -std=c99
Erzeugt keine adc
Anweisungen, wie von objdump
überprüft. Meine GCC-Version ist i686-pc-mingw32-gcc (GCC) 4.5.2
.
GCC wird das Carry-Flag verwenden, wenn es sehen kann, dass es: muss
Wenn zum Beispiel zwei uint64_t
-Werte auf einer 32-Bit-Maschine hinzugefügt werden, muss dies zu einem 32-Bit ADD
plus einem 32-Bit ADC
führen. Aber abgesehen von den Fällen, in denen der Compiler gezwungen ist, das Carry zu verwenden, kann er wahrscheinlich nicht dazu bewegt werden, dies ohne Assembler zu tun. Daher kann es vorteilhaft sein, den größten verfügbaren Integer-Typ zu verwenden, um es GCC zu ermöglichen, Operationen zu optimieren, indem Sie effektiv wissen lassen, dass die einzelnen "Komponenten" des Werts zusammengehören.
Für die einfache Addition könnte ein anderer Weg zur Berechnung des Übertrags darin bestehen, die relevanten Bits in den Operanden zu betrachten, wie zum Beispiel:
%Vor%Tags und Links optimization c gcc compiler-optimization arbitrary-precision