Get GCC zur Verwendung von Carry-Logik für arbiträre Präzisionsarithmetik ohne Inline-Assembly?

8

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 .

    
morrog 29.03.2013, 02:41
quelle

1 Antwort

1

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%     
JimmyB 29.03.2013 13:57
quelle