x86 รหัสเครื่อง (พร้อม SSE2), 36 ไบต์
; 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
ฟังก์ชั่นด้านบนยอมรับคำอธิบายของวงกลมสองวง (x- และ y- พิกัดของจุดกึ่งกลางและรัศมี) และส่งกลับค่าบูลีนที่ระบุว่าพวกเขาตัดกันหรือไม่
มันใช้หลักการเรียกเวกเตอร์โดยที่พารามิเตอร์ถูกส่งผ่านในการลงทะเบียน SIMD บน x86-32 และ Windows 64-bit นี้เป็นเรียกประชุม__vectorcall
เมื่อวันที่ 64 บิต Unix / Linux / Gnu นี้เป็นมาตรฐานระบบวี AMD64 เรียกประชุม
ค่าส่งคืนจะเหลืออยู่ในไบต์ต่ำEAX
เช่นเดียวกับมาตรฐานที่มีการเรียกการประชุม x86 ทั้งหมด
รหัสนี้ทำงานได้ดีเท่าเทียมกันในโปรเซสเซอร์ 32- บิตและ 64- บิต x86 ตราบใดที่พวกเขาสนับสนุนชุดคำสั่ง SSE2 (ซึ่งจะเป็น Intel Pentium 4 และใหม่กว่าหรือ AMD Athlon 64 และใหม่กว่า)
รุ่น AVX ขนาด 36 ไบต์
หากคุณกำหนดเป้าหมายเป็นAVXคุณอาจต้องการเพิ่มคำนำหน้า VEX ลงในคำแนะนำ สิ่งนี้จะไม่เปลี่ยนจำนวนไบต์ เพียงไบต์จริงที่ใช้ในการเข้ารหัสคำแนะนำ:
; 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
คำแนะนำ AVX มีข้อได้เปรียบในการใช้งานตัวถูกดำเนินการสามตัวซึ่งช่วยให้คุณสามารถดำเนินการแบบไม่ทำลายได้ แต่นั่นไม่ได้ช่วยให้เราบีบอัดรหัสที่นี่ได้จริงๆ อย่างไรก็ตามการผสมคำสั่งที่มีและไม่มีคำนำหน้า VEX อาจส่งผลให้เกิดโค้ดย่อยที่ดีที่สุดดังนั้นโดยทั่วไปคุณต้องการที่จะยึดคำสั่ง AVX ทั้งหมดหากคุณกำหนดเป้าหมายเป็น AVX และในกรณีนี้มันไม่ได้ทำให้จำนวนไบต์ของคุณเสียหาย