2015-12-11 15 views
5

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?

+0

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. –

Antwort

4

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.

+0

@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. –

+0

@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. –

2

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.