Kode Mesin x86 (dengan 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
Fungsi di atas menerima deskripsi dua lingkaran (koordinat x dan y dari titik pusat dan jari-jari), dan mengembalikan nilai Boolean yang menunjukkan apakah mereka berpotongan atau tidak.
Menggunakan konvensi pemanggilan vektor, di mana parameter dilewatkan dalam register SIMD. Pada x86-32 dan 64-bit Windows, ini adalah __vectorcall
konvensi pemanggilan . Pada Unix / Linux / Gnu 64-bit, ini adalah konvensi pemanggilan Sistem V AMD64 standar .
Nilai kembali dibiarkan dalam byte rendah EAX
, seperti standar dengan semua konvensi pemanggilan x86.
Kode ini berfungsi dengan baik pada prosesor x86 32-bit dan 64-bit, selama mereka mendukung set instruksi SSE2 (yang akan menjadi Intel Pentium 4 dan yang lebih baru, atau AMD Athlon 64 dan yang lebih baru).
Versi AVX, masih 36 byte
Jika Anda menargetkan AVX , Anda mungkin ingin menambahkan awalan VEX ke instruksi. Ini tidak mengubah jumlah byte; hanya byte aktual yang digunakan untuk menyandikan instruksi:
; 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
Instruksi AVX memiliki keuntungan dengan mengambil tiga operan, memungkinkan Anda untuk melakukan operasi yang tidak merusak, tetapi itu tidak benar-benar membantu kami untuk memadatkan kode di sini. Namun, mencampur instruksi dengan dan tanpa awalan VEX dapat menghasilkan kode yang kurang optimal, jadi Anda biasanya ingin tetap menggunakan semua instruksi AVX jika Anda menargetkan AVX, dan dalam hal ini, bahkan tidak akan mengganggu jumlah byte Anda.