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
上記の関数は、2つの円(中心点と半径のx座標とy座標)の記述を受け入れ、それらが交差するかどうかを示すブール値を返します。
パラメータがSIMDレジスタで渡されるベクター呼び出し規約を使用します。x86-32および64ビットWindowsでは、これは__vectorcall
呼び出し規約です。64ビットUnix / Linux / Gnuでは、これは標準のSystem V AMD64呼び出し規約です。です。
戻り値は、の下位バイトに残ります EAX
、すべてのx86呼び出し規約の標準であるようます。
このコードは、SSE2命令セットをサポートしている限り、32ビットと64ビットのx86プロセッサーで同様に機能します。(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命令には3つのオペランドを使用するという利点があり、非破壊的な操作を行うことができますが、それでもここでコードを圧縮するのに役立ちません。ただし、VEXプレフィックスを含む命令と含まない命令を混在させると、最適でないコードが生成される可能性があるため、一般に、AVXをターゲットにしている場合はすべての AVX命令を使用する必要がありますが、この場合、バイトカウントさえ損ないません。