Abbiamo ancora bisogno di emulare gli interi a 128 bit nel software, o c'è un supporto hardware per loro nel tuo processore desktop medio in questi giorni?C'è un supporto hardware per interi a 128 bit nei processori moderni?
risposta
Il set di istruzioni x86-64 può eseguire 64 bit * da 64 bit a 128 bit utilizzando un'istruzione (mul
per unsigned imul
per ciascun firmatario con un solo operando), quindi direi che in qualche misura l'istruzione x86 set include alcuni supporti per interi a 128 bit.
Se il set di istruzioni non ha un'istruzione per eseguire 64-bit * da 64 bit a 128 bit, è necessario several instructions to emulate this.
Ecco perché le operazioni a 128 bit da 128 bit a 128 bit inferiori possono essere eseguite con poche istruzioni con x86-64. Ad esempio con GCC
__int128 mul(__int128 a, __int128 b) {
return a*b;
}
produce questo assieme
imulq %rdx, %rsi
movq %rdi, %rax
imulq %rdi, %rcx
mulq %rdx
addq %rsi, %rcx
addq %rcx, %rdx
che utilizza un 64-bit * 64-bit alle istruzioni 128 bit, due a 64 bit * 64-bit per abbassare 64 bit istruzioni e due aggiunte a 64 bit.
@Filip: c'è anche 'adc' /' sbb' (aggiungi con carry, sottrazione con prestito) e div/idiv (128b/64b -> 64b dividendo e 64b resto). Quindi aggiungere/sottrarre interi 128b richiede solo due istruzioni (senza contare il movimento dei dati). Le cose booleane bit a bit possono essere eseguite nei vettori SSE. –
@PeterCordes, buoni punti. Non ho pensato ad "adc" come supporto a 128 bit, ma vedo il tuo punto. Alcuni set di istruzioni non hanno 'adc' (ad esempio SSE/AVX) e quindi richiedono più istruzioni per eseguire aggiunte multi-word. –
La risposta breve è: NO!
Per ulteriori informazioni, i registri SSE sono ampi a 128 bit, ma non esistono istruzioni per trattarli come interi a 128 bit. Nella migliore delle ipotesi, questi registri vengono considerati come due interi a 64 bit (non firmati). Operazioni come addizione/... possono essere costruite aggiungendo parallelamente questi due valori a 64 bit e gestendo manualmente l'overflow, ma non con una singola istruzione. L'implementazione di questa può diventare piuttosto complicato e "brutto", guarda qui:
How can I add together two SSE registers
Ciò dovrebbe essere fatto per ogni operazione di base con i vantaggi probabilmente discutibili rispetto al Un'implementazione con registri a 64 bit di uso generale (" emulazione "nel software). D'altra parte, un vantaggio di questo approccio SSE sarebbe che una volta implementato, funzionerà anche per interi a 256 bit (AVX2) e interi a 512 bit (AVX-512) con solo piccole modifiche.
- 1. Come utilizzare interi 128 bit in Cython
- 2. XOR bitset a 128 bit
- 3. Allineamento della memoria sui processori moderni?
- 4. Esiste un modo per simulare operazioni bit a bit su interi per _m256 tipi su AVX?
- 5. Cross-over due interi bit a bit
- 6. Specifica di valori letterali interi senza segno a 64 bit nei modelli di dati a 64 bit
- 7. Istruzione SSE per sommare interi 32 bit a 64 bit
- 8. divisione a 128 bit intrinseco in Visual C++
- 9. Supporto hardware da un'applicazione Web
- 10. Va bene troncare un hash SHA256 a 128 bit?
- 11. Esiste un numero intero a 128 bit in gcc?
- 12. Perché RDTSC è un'istruzione virtualizzata sui processori moderni?
- 13. -128 e 128 in complemento a 2
- 14. Supporto .NET Framework per hardware multicore
- 15. C'è un modo per ottenere CSS XSS nei browser moderni?
- 16. ARM NEON: confronto dei valori a 128 bit
- 17. FFMPEG con supporto codec hardware
- 18. Prestazioni di numeri interi a 32 bit in un ambiente a 64 bit (C++)
- 19. Elementi intrinseci SSE: Converti i float a 32 bit in interi a 8 bit UNSIGNED
- 20. EDSAC - Numeri interi a 17 bit e 35 bit
- 21. Dimensioni di "long long" nella macchina a 128 bit?
- 22. Spostamenti a 128 bit utilizzando il linguaggio assembly?
- 23. Segmentazione della memoria nei moderni sistemi operativi
- 24. Generazione di chiavi a 128 bit con keytool
- 25. Rotazione a 128 bit usando ARM Neon intrinsec
- 26. Divisione a 128 bit senza segno su macchina a 64 bit
- 27. RC4 crittografia 128 bit in C#
- 28. JavaScript: convertire un intero 52-bit per interi 20-bit e 32-bit
- 29. JSON Hijacking è ancora un problema nei browser moderni?
- 30. Come posso convertire un UUID di servizio a 16 bit Bluetooth in un UUID a 128 bit?
Ho aggiunto il tag x86 poiché questo è il set di istruzioni desktop più comune. La tua domanda avrebbe un appeal più ampio se includi anche tablet e telefoni che utilizzano principalmente ARM. Dubito che ARM abbia istruzioni a 64-bit * da 64-bit a 128-bit. –