Müssen 128-Bit-Ganzzahlen in Software immer noch emuliert werden, oder gibt es heutzutage Hardwareunterstützung in Ihrem durchschnittlichen Desktop-Prozessor?Gibt es Hardwareunterstützung für 128-Bit-Ganzzahlen in modernen Prozessoren?
Antwort
Der x86-64 Befehlssatz tun kann 64-Bit · 64-Bit-128-Bit einen Befehl (mul
für unsigned imul
für jede mit einem Operanden vorzeichenbehaftet) so würde ich, dass bis zu einem gewissen Grad argumentiert, dass die x86-Instruktion unter Verwendung Set enthält einige Unterstützung für 128-Bit-Ganzzahlen.
Wenn Ihr Befehlssatz keine Anweisung für 64-Bit * 64-Bit bis 128-Bit hat, dann benötigen Sie several instructions to emulate this.
Deshalb können 128-Bit * 128-Bit- bis niedrigere 128-Bit-Operationen mit wenigen Anweisungen mit x86-64 ausgeführt werden. Zum Beispiel mit GCC
__int128 mul(__int128 a, __int128 b) {
return a*b;
}
erzeugt diese Anordnung
imulq %rdx, %rsi
movq %rdi, %rax
imulq %rdi, %rcx
mulq %rdx
addq %rsi, %rcx
addq %rcx, %rdx
, die einen 64-Bit · 64-Bit-128-Bit-Befehle verwendet, zwei 64-Bit · 64-Bit-64-Bit zu senken, Anweisungen und zwei 64-Bit-Ergänzungen.
@Filip: Es gibt auch 'adc' /' sbb' (add mit carry, subtrahiere mit borrow) und div/idiv (128b/64b -> 64b Dividend und 64b Rest). Das Addieren/Subtrahieren von 128-Bit-Ganzzahlen erfordert nur zwei Anweisungen (ohne die Datenbewegung zu zählen). Bitweises boolesches Zeug kann in SSE-Vektoren gemacht werden. –
@PeterCordes, gute Punkte. Ich dachte nicht an "adc" als 128-Bit-Unterstützung, aber ich verstehe Ihren Standpunkt. Einige Befehlssätze haben keine "adc" (z. B. SSE/AVX) und erfordern daher mehr Anweisungen, um Mehrwort-Additionen auszuführen. –
Kurze Antwort ist: NEIN!
Um mehr zu erläutern, sind die SSE-Register 128-Bit breit, aber keine Anweisungen existieren, um sie als 128-Bit-Ganzzahlen zu behandeln. Im besten Fall werden diese Register als zwei 64-Bit (un) vorzeichenbehaftete Ganzzahlen behandelt. Operationen wie addition/... können erstellt werden, indem diese beiden 64-Bit-Werte parallel addiert werden und der Überlauf manuell gehandhabt wird, aber nicht mit einer einzigen Anweisung. Die Implementierung kann dies recht kompliziert und „hässlich“ bekommen, schau mal hier:
How can I add together two SSE registers
Dies würde mit 64-Bit-Universalregistern zu einer Anwendungs verglichen mit vermutlich fragwürdigen Vorteilen für jede grundlegende Operation durchgeführt werden muß (“ Emulation "in Software). Auf der anderen Seite wäre ein Vorteil dieses SSE-Ansatzes, dass er nach seiner Implementierung auch für 256-Bit-Ganzzahlen (AVX2) und 512-Bit-Ganzzahlen (AVX-512) mit nur geringfügigen Modifikationen funktioniert.
Ich habe das x86-Tag hinzugefügt, da dies der am häufigsten verwendete Desktop-Befehlssatz ist. Ihre Frage würde eine breitere Anziehungskraft haben, wenn Sie auch Tablets und Telefone einschließen, die meistens ARM verwenden. Ich bezweifle, ARM hat 64-Bit * 64-Bit- bis 128-Bit-Anweisungen. –