2015-12-11 14 views
5

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?

+0

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

risposta

4

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.

+0

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

+0

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

2

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.

Problemi correlati