Codice macchina x86 (con SSE2), 36 byte
; bool CirclesOverlap(double x1, double y1, double r1,
; double x2, double y2, double r2);
F2 0F 5C C3 subsd xmm0, xmm3 ; x1 - x2
F2 0F 5C CC subsd xmm1, xmm4 ; y1 - y2
F2 0F 58 D5 addsd xmm2, xmm5 ; r1 + r2
F2 0F 59 C0 mulsd xmm0, xmm0 ; (x1 - x2)^2
F2 0F 59 C9 mulsd xmm1, xmm1 ; (y1 - y2)^2
F2 0F 59 D2 mulsd xmm2, xmm2 ; (r1 + r2)^2
F2 0F 58 C1 addsd xmm0, xmm1 ; (x1 - x2)^2 + (y1 - y2)^2
66 0F 2F D0 comisd xmm2, xmm0
0F 97 C0 seta al ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3 ret
La funzione sopra accetta le descrizioni di due cerchi (coordinate x e y del punto centrale e un raggio) e restituisce un valore booleano che indica se si intersecano o meno.
Utilizza una convenzione di chiamata vettoriale, in cui i parametri vengono passati nei registri SIMD. Su Windows x86-32 e 64 bit, questa è la __vectorcallconvenzione di chiamata . Su Unix / Linux / Gnu a 64 bit, questa è la convenzione di chiamata standard System V AMD64 .
Il valore restituito viene lasciato nel byte basso di EAX, come standard con tutte le convenzioni di chiamata x86.
Questo codice funziona ugualmente bene su processori x86 a 32 e 64 bit, purché supportino il set di istruzioni SSE2 (che sarebbe Intel Pentium 4 e versioni successive o AMD Athlon 64 e versioni successive).
Versione AVX, ancora 36 byte
Se scegli come target AVX , probabilmente vorrai aggiungere un prefisso VEX alle istruzioni. Questo non cambia il conteggio dei byte; solo i byte effettivi utilizzati per codificare le istruzioni:
; bool CirclesOverlap(double x1, double y1, double r1,
; double x2, double y2, double r2);
C5 FB 5C C3 vsubsd xmm0, xmm0, xmm3 ; x1 - x2
C5 F3 5C CC vsubsd xmm1, xmm1, xmm4 ; y1 - y2
C5 EB 58 D5 vaddsd xmm2, xmm2, xmm5 ; r1 + r2
C5 FB 59 C0 vmulsd xmm0, xmm0, xmm0 ; (x1 - x2)^2
C5 F3 59 C9 vmulsd xmm1, xmm1, xmm1 ; (y1 - y2)^2
C5 EB 59 D2 vmulsd xmm2, xmm2, xmm2 ; (r1 + r2)^2
C5 FB 58 C1 vaddsd xmm0, xmm0, xmm1 ; (x1 - x2)^2 + (y1 - y2)^2
C5 F9 2F D0 vcomisd xmm2, xmm0
0F 97 C0 seta al ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3 ret
Le istruzioni AVX hanno il vantaggio di prendere tre operandi, permettendoti di eseguire operazioni non distruttive, ma ciò non ci aiuta davvero a compattare il codice qui. Tuttavia, mescolando le istruzioni con e senza i prefissi VEX si può ottenere un codice non ottimale, quindi in genere si desidera attenersi a tutte le istruzioni AVX se si sta prendendo di mira AVX e, in questo caso, non danneggia nemmeno il conteggio dei byte.